VC调试入门

[自己总结+网上流传]Visual C++编程技巧 1. 如何获取应用程序的实例句柄?应用程序的 实例句柄保存在CWinAppIm_hInstance 中,可以这么调用AfxGetInstancdHandle获得句柄.Example: HANDLE hInstance=AfxGetInstanceHandle();2. 如何通过代码获得应用程序主窗口的指针?主窗口的 指针保存在CWinThread::m_pMainWnd中,调用 AfxGetMai 阅读详情


概述
调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。
这里我简要的根据自己的经验列出调试中比较常用的技巧,希望对大家有用。
本文约定,在选择菜单时,通过/表示分级菜单,例如File/Open表示顶级菜单File的子菜单Open。
 
设置
为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppWizard创建的工程中包含的Debug Configuration自动包含调试信息,但是是不是Debug版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration中增加调试信息,包括Release版本。
为了增加调试信息,可以按照下述步骤进行:

  • 打开Project settings对话框(可以通过快捷键ALT+F7打开,也可以通过IDE菜单Project/Settings打开)
  • 选择C/C++页,Category中选择general ,则出现一个Debug Info下拉列表框,可供选择的调试信息 方式包括:
     
    命令行Project settings说明
    无None没有调试信息
    /ZdLine Numbers Only目标文件或者可执行文件中只包含全局和导出符号以及代码行信息,不包含符号调试信息
    /Z7C 7.0- Compatible目标文件或者可执行文件中包含行号和所有符号调试信息,包括变量名及类型,函数及原型等
    /ZiProgram Database创建一个程序库(PDB),包括类型信息和符号调试信息。
    /ZIProgram Database for Edit and Continue除了前面/Zi的功能外,这个选项允许对代码进行调试过程中的修改和继续执行。这个选项同时使#pragma设置的优化功能无效

  • 选择Link页,选中复选框"Generate Debug Info",这个选项将使连接器把调试信息写进可执行文件和DLL
  • 如果C/C++页中设置了Program Database以上的选项,则Link incrementally可以选择。选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译。

断点
断点是调试器设置的一个代码位置。当程序运行到断点时,程序中断执行,回到调试器。断点是 最常用的技巧。调试时,只有设置了断点并使程序回到调试器,才能对程序进行在线调试。

设置断点:可以通过下述方法设置一个断点。首先把光标移动到需要设置断点的代码行上,然后

  • 按F9快捷键
  • 弹出Breakpoints对话框,方法是按快捷键CTRL+B或ALT+F9,或者通过菜单Edit/Breakpoints打开。打开后点击Break at编辑框的右侧的箭头,选择 合适的位置信息。一般情况下,直接选择line xxx就足够了,如果想设置不是当前位置的断点,可以选择Advanced,然后填写函数、行号和可执行文件信息。

去掉断点:把光标移动到给定断点所在的行,再次按F9就可以取消断点。同前面所述,打开Breakpoints对话框后,也可以按照界面提示去掉断点。

条件断点:可以为断点设置一个条件,这样的断点称为条件断点。对于新加的断点,可以单击Conditions按钮,为断点设置一个表达式。当这个表达式发生改变时,程序就 被中断。底下设置包括“观察数组或者结构的元素个数”,似乎可以设置一个指针所指向的内存区的大小,但是我设置一个比较的值但是改动 范围之外的内存区似乎也导致断点起效。最后一个设置可以让程序先执行多少次然后才到达断点。

数据断点:数据断点只能在Breakpoints对话框中设置。选择“Data”页,就显示了设置数据断点的对话框。在编辑框中输入一个表达式,当这个 表达式的值发生变化时,数据断点就到达。一般情况下,这个表达式应该由运算符和全局变量构成,例如:在编辑框中输入 g_bFlag这个全局变量的名字,那么当程序中有g_bFlag= !g_bFlag时,程序就将停在这个语句处。

消息断点:VC也支持对Windows消息进行截获。他有两种方式进行截获:窗口消息处理函数和特定消息中断。
在Breakpoints对话框中选择Messages页,就可以设置消息断点。如果在上面那个对话框中写入消息处理函数的名字,那么 每次消息被这个函数处理,断点就到达(我觉得如果采用普通断点在这个函数中截获,效果应该一样)。如果在底下的下拉 列表框选择一个消息,则每次这种消息到达,程序就中断。

值
Watch
VC支持查看变量、表达式和内存的值。所有这些观察都必须是在断点中断的情况下进行。
观看变量的值最简单,当断点到达时,把光标移动到这个变量上,停留一会就可以看到变量的值。
VC提供一种被成为Watch的机制来观看变量和表达式的值。在断点状态下,在变量上单击右键,选择Quick Watch, 就弹出一个对话框,显示这个变量的值。
单击Debug工具条上的Watch按钮,就出现一个Watch视图(Watch1,Watch2,Watch3,Watch4),在该视图中输入变量或者表达式,就可以观察 变量或者表达式的值。注意:这个表达式不能有副作用,例如++运算符绝对禁止用于这个表达式中,因为这个运算符将修改变量的值,导致 软件的逻辑被破坏。

Memory
由于指针指向的数组,Watch只能显示第一个元素的值。为了显示数组的后续内容,或者要显示一片内存的内容,可以使用memory功能。在 Debug工具条上点memory按钮,就弹出一个对话框,在其中输入地址,就可以显示该地址指向的内存的内容。

Varibles

Debug工具条上的Varibles按钮弹出一个框,显示所有当前执行上下文中可见的变量的值。特别是当前指令涉及的变量,以红色显示。

寄存器
Debug工具条上的Reigsters按钮弹出一个框,显示当前的所有寄存器的值。

进程控制
VC允许被中断的程序继续运行、单步运行和运行到指定光标处,分别对应快捷键F5、F10/F11和CTRL+F10。各个快捷键功能如下:
 

快捷键说明
F5继续运行
F10单步,如果涉及到子函数,不进入子函数内部
F11单步,如果涉及到子函数,进入子函数内部
CTRL+F10运行到当前光标处。

Call Stack
调用堆栈反映了当前断点处函数是被那些函数按照什么顺序调用的。单击Debug工具条上的Call stack就显示Call Stack对话框。在CallStack对话框中显示了一个调用系列,最上面的是当前函数,往下依次是调用函数的上级函数。单击这些函数名可以跳到对应的函数中去。

其他调试手段
系统提供一系列特殊的函数或者宏来处理Debug版本相关的信息,如下:

宏名/函数名说明
TRACE使用方法和printf完全一致,他在output框中输出调试信息
ASSERT它接收一个表达式,如果这个表达式为TRUE,则无动作,否则中断当前程序执行。对于系统中出现这个宏 导致的中断,应该认为你的函数调用未能满足系统的调用此函数的前提条件。例如,对于一个还没有创建的窗口调用SetWindowText等。
VERIFY和ASSERT功能类似,所不同的是,在Release版本中,ASSERT不计算输入的表达式的值,而VERIFY计算表达式的值。

关注
一个好的程序员不应该把所有的判断交给编译器和调试器,应该在程序中自己加以程序保护和错误定位,具体措施包括:

  • 对于所有有返回值的函数,都应该检查返回值,除非你确信这个函数调用绝对不会出错,或者不关心它是否出错。
  • 一些函数返回错误,需要用其他函数获得错误的具体信息。例如accept返回INVALID_SOCKET表示accept失败,为了查明 具体的失败原因,应该立刻用WSAGetLastError获得错误码,并针对性的解决问题。
  • 有些函数通过异常机制抛出错误,应该用TRY-CATCH语句来检查错误
  • 程序员对于能处理的错误,应该自己在底层处理,对于不能处理的,应该报告给用户让他们决定怎么处理。如果程序出了异常, 却不对返回值和其他机制返回的错误信息进行判断,只能是加大了找错误的难度。

另外:VC中要编制程序不应该一开始就写cpp/h文件,而应该首先创建一个合适的工程。因为只有这样,VC才能选择合适的编译、连接 选项。对于加入到工程中的cpp文件,应该检查是否在第一行显式的包含stdafx.h头文件,这是Microsoft Visual Studio为了加快编译 速度而设置的预编译头文件。在这个#include "stdafx.h"行前面的所有代码将被忽略,所以其他头文件应该在这一行后面被包含。
对于.c文件,由于不能包含stdafx.h,因此可以通过Project settings把它的预编译头设置为“不使用”,方法是:

  • 弹出Project settings对话框
  • 选择C/C++
  • Category选择Precompilation Header
  • 选择不使用预编译头。

 

VISUAL C++ 调试指南

 

                                  

 

学会使用一个新的编译器的很重要的一步是学会如何使用源代码的调试功能。

 

Visual C++的调试功能是从早期的调试工具CodeBase发展而成,这个名叫CodeBase调试工具研究成为一种工业标准。

 

C++的错误大体可以分为两类,一类是编译器和连接器可以发现的语法错误,比如拼写错误和参数设置错误;但是在没有语法错误的情况下,也可能会发生让程序无法正确运行的逻辑错误。我们把这种错误叫做BUG。VISUAL C++的有如下两个基本调试功能:找出BUG发生的地方和分析如何修改BUG。该调试工具允许你每次只执行一行程序代码,这样你可以更方便地找到BUG发生的地方。

 

VISUAL C++ 调试工具具有如下几个特征:

    - 设置断点 跟踪程序段的执行

    - 进入函数调用或跳过函数调用

    - 设置监视窗口观察变量和表达式

你可以在需要设置断点 的程序行上用鼠标左键单击insert/remove breakpoint设置或移除断点 。设置断点 后,该行的左侧空白处将出现红色的小圆点,这是断点 的标志。在你点击移除之前,这个断点 将永远存在。你可以在EDIT->BREAKPOINT下查看现在设置的所有断点 的位置。当程序设置断点 后可以有两种操作方法。第一,你可以进入一个函数并执行它的下一条命令,第二,你可以按F10键跳过这个函数,按F11可以让调试工具指向函数的第一行。同样的,Visual C++调试器可以设置条件断点 。

监视窗口 可以显示变量,对象和表达式在程序执行过程中值的变化情况。监视窗口中,你还可以单击左边的“+”号打开对象的数据成员。这样你可以观察变量在窗口中的变化情况。另外,监视窗口也可以用来查看寄存器和编译器在编译程序时产生的代码。

快捷监视窗口提供程序执行过程中变量和表达式的快捷查看。在编辑窗口中右键单击对象名称可以选择快捷监视。

Visual C++调试器提供了一种不用监视窗口而查看变量值的方法,把鼠标悬停在变量上面,0.5秒后变量的值将会显示出来。

Edit and Continue功能允许在调试过程中一边调试(即不退出调试)一边对程序进行修改。DEBUG->APPLY CODE CHANGES可以选择个功能。运用这个功能时候程序会在内存中重编译和做修改。

Visual C++可以设置打开或关闭调试信息。可以在如下位置打开调试信息报告BUILD->SET ACTIVE CONFIGURATION-> 选择Debugging.

VISUAL C++ 调试指南

                                  

 

学会使用一个新的编译器的很重要的一步是学会如何使用源代码的调试功能。

 

Visual C++的调试功能是从早期的调试工具CodeBase发展而成,这个名叫CodeBase调试工具研究成为一种工业标准。


 


C++的错误大体可以分为两类,一类是编译器和连接器可以发现的语法错误,比如拼写错误和参数设置错误;但是在没有语法错误的情况下,也可能会发生让程序无法正确运行的逻辑错误。我们把这种错误叫做BUG。VISUAL C++的有如下两个基本调试功能:找出BUG发生的地方和分析如何修改BUG。该调试工具允许你每次只执行一行程序代码,这样你可以更方便地找到BUG发生的地方。

 

VISUAL C++ 调试工具具有如下几个特征:

    - 设置断点 跟踪程序段的执行

    - 进入函数调用或跳过函数调用

    - 设置监视窗口观察变量和表达式

你可以在需要设置断点 的程序行上用鼠标左键单击insert/remove breakpoint设置或移除断点 。设置断点 后,该行的左侧空白处将出现红色的小圆点,这是断点 的标志。在你点击移除之前,这个断点 将永远存在。你可以在EDIT->BREAKPOINT下查看现在设置的所有断点 的位置。当程序设置断点 后可以有两种操作方法。第一,你可以进入一个函数并执行它的下一条命令,第二,你可以按F10键跳过这个函数,按F11可以让调试工具指向函数的第一行。同样的,Visual C++调试器可以设置条件断点 。

监视窗口 可以显示变量,对象和表达式在程序执行过程中值的变化情况。监视窗口中,你还可以单击左边的“+”号打开对象的数据成员。这样你可以观察变量在窗口中的变化情况。另外,监视窗口也可以用来查看寄存器和编译器在编译程序时产生的代码。

快捷监视窗口提供程序执行过程中变量和表达式的快捷查看。在编辑窗口中右键单击对象名称可以选择快捷监视。

Visual C++调试器提供了一种不用监视窗口而查看变量值的方法,把鼠标悬停在变量上面,0.5秒后变量的值将会显示出来。

Edit and Continue功能允许在调试过程中一边调试(即不退出调试)一边对程序进行修改。DEBUG->APPLY CODE CHANGES可以选择个功能。运用这个功能时候程序会在内存中重编译和做修改。

Visual C++可以设置打开或关闭调试信息。可以在如下位置打开调试信息报告BUILD->SET ACTIVE CONFIGURATION-> 选择Debugging.


一个调试实例 

新建一个工程,并输入如下代码
#include <iostream.h>

#include <conio.h>                  //Returns the factorial of n

 

int Factorial(int n) {                  //Loop variable 

  int i; 

  int Result;                              //Initialize the result

  Result = n;                             //Now multiply by 1 .. n 

  for (i = 0; i < n; i++) 

       Result *= i;
  return Result;

}


void main() {

  int n;                                         //Get a value

 

  cout << "What value?"; 

  cin >> n;                                   //Print the factorial

 

  cout << Factorial(n) << endl;


操作步骤 

1 执行程序,观察输入和输出情况 

2 在编辑窗口中编辑程序,并在main()函数的第二个cout处设置一个断点 。 

3 在监视窗口中设置监视变量n 

4 调试进入函数Factorial() 

5 在快捷监视窗口中监视变量Result 

6 分析错误 

7 把光标移动到错误的行并作出更正。 

8 选择DEGUG->STOP DEBUGGING.停止调试 

9 单击BUILD命令组建修改后的程序。 

10 对程序做适当改变使其结果变化,并运行程序使这些改变实现。具体操作方法为选择DEBUG->APPLY CODE CHANGES。然后在作改变的行单击右键,并在弹出菜单中选择SET NEXT STATEMENT。 

11 选择菜单中的GO按钮。 

12 移除所有的断点 并重新运行程序。 

13 参阅网上的调试工具相关文章并把相关特征写在下面。

VC++调试技巧学习总结 VC6.0调试方法 有时候,我们编写好一个程序后,希望通过调试来知道变量值的变化情况,下面我和大家分享一下怎么利用VC6.0来查看变量值变化情况。 工具/原料 VC6.0软件、待测试程序 方法/步骤 1 打开你要调试代码的工作空间。 2 按快捷键F5或点击以下图片上标记的图标进入调试模式。 3 打开调试工具条,一般情况下当你按F5键后会自动弹出,如果没有弹出的话 阅读详情

相关推荐

巧用Visual Studio中的数据断点去排查C++内存越界问题

本文通过一个项目问题分析实例,去详细介绍如何使用Visual Studio中的数据断点去快速高效地排查C++软件中的内存越界问题。

dvlinker的技术专栏 1万+

VC调试入门 作者:阿荣

 概述调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。这里我简要的根据自己的经验列出调试中比较常用的技巧,希望对大家有用。本文约定,在选择菜单时,通过/表示分级菜单,例如File/Open表示顶级菜单File的子菜单Open。  设置为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppWizard创

bluebohe的专栏 4609

VOF模型求解方法:从SIMPLEC到PISO的稳定性优化策略

本文深入探讨了VOF模型求解方法中SIMPLEC与PISO算法的稳定性优化策略,重点分析了两种算法在稳态和瞬态问题中的应用差异。通过对比PRESTO离散化方法与其他格式的优劣,提供了针对多相流模拟的实用设置建议和稳定性优化技巧,帮助工程师有效提升计算效率和精度。

yellow的专栏 1153

VC++断点调试

建立好工程,准备好代码,开始调试 1.添加断点(要查看值的变量)   先定位(光标移动到对应行)好要添加断点的代码行, 点击工具栏中,小手的图标。 2. debug模式运行代码    运行点击 图片最左侧的图标就行,或者快捷键 Ctrl+ Shift+ F5 3.开始调试 调试工具拦具体不讲, 开始后 F10 就可以了。 4.查看变量

249198337的专栏 1万+

宇树机器狗go2—slam建图(1)点云格式

上一篇番外文章教大家如何在宇树机器狗go2的gazebo仿真环境中实现简单的导航运动,本期文章会教大家如何让宇树的机器狗go2在仿真环境中进行slam建图时经常会遇到的一些点云格式,在后续的slam建图和slam算法解析的时候会经常与这些点云信息打交道。宇树机器狗go2仿真会作为一个长期项目来进行不定期更新,仿真不只限于在gazebo上实现,后面还会在isaac sim等仿真平台上教大家如何搭建,其目的还是帮助各位都能以较低的成本加入到宇树机器狗go2的学习中。

古月居 3271

【爬虫】Python实现爬取淘宝商品信息(超详细)

项目基于Python的第三方库Selenium模拟浏览器运行、PyQuery解析和操作HTML文档,获取淘宝平台中某类商品的详细信息(商品标题、价格、销量、商铺名称、地区、商品详情页链接、商铺链接等),并基于第三方库openpyxl建立、存储于Excel表格中。# 全局变量count = 1 # 写入Excel商品计数# 启动ChromeDriver服务# 关闭自动测试状态显示 // 会导致浏览器报:请停用开发者模式# 把chrome设为selenium驱动的浏览器代理;# 窗口最大化。

qq_46315152的博客 4万+

【vc调试】VC调试入门

VC调试入门 作者:阿荣  概述 调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。 这里我简要的根据自己的经验列出调试中比较常用的技巧,希望对大家有用。 本文约定,在选择菜单时,通过/表示分级菜单,例如File/Open表示顶级菜单File的子菜单Open。    设置 为了调试一个程序

pirate97的专栏 511

android广告SDK原理详解(附源码)

广大的开发者吃糠咽菜开发了一两款APP,获取了一些流量后自然就会想到流量变现,一般情况下大家会选择到百度联盟或者Google Admob这些广告服务提供商注册开发者账号,在自己的APP里面加上几行广告位代码,集成他们的广告SDK包。然后谋事在人,成事在天,只有每天看报表查查收益。   也有一些开发者为了能够提高自己的变现水平,同时接入了好几家的sdk,哪家出的收益高一点我就出哪家的广告,但是这

rmcgogo的博客 1万+

vc调试适合入门。

编写易于调试的VC代码一 程序的设计要避免错误,首先要从好的设计开始。对于程序的设计,需考虑到程序的两个特性:1简单性 大多数常见的错误来源于程序设计中不必要的复杂成分。一个好的设计应该反映问题本身的要求,而不必为了刻意追求“满足将来的需要”而添加不必要的特性。实际上,简单优雅的设计比那些复杂的设计更能迎合未来的需求。2 耦合性 耦合(decoupling)性用来衡量不同对象之间的依赖程度。松耦合

1832

几种在NCBI中查询获取目的基因序列的方法

几种在NCBI中查询获取目的基因序列的方法 在NCBI中,如何查询并下载获得某物种的某特定功能的基因序列,相信对于看到此篇的大部分同学来说都不陌生了。想到对于刚开始接触生信的同学们来说,也许尚不能很熟练地在NCBI中查询想要的基因序列,因此在这里简要作了一个总结,希望对初学生信的同学们有所帮助。 此篇博文源于此前有同学问我,提到他导师给他布置任务,查找相关的文献,看相关文献中都报道了哪些细菌物种能够产生聚羟基脂肪酸酯(polyhydroxyalkanoate ,PHA),参与合成该产物的基因都有哪些,然后在

qq_23435961的博客 1万+

一步一步教你如何安装IP-Guard(客户端WINDOWS篇)

1、安装完服务器后,在服务器右下角有一个IP-GUARD图标:如图 2、点图标右键选注册: 3、注册成功后, 4、在开始菜单里选生成客户端安装包。 5、生成客户端安装包成功,安装名字可以任意,但是最好是英文名字。 6、将客户端安装程序复制到桌面。 7、退出所有杀毒软件、安全卫士、电脑管家等然后运行 8、安装完成后,立即重启计算机。IPguard客户端安装完成。 9、这样在控制里就可以看到已经安装客户端的计算机,在线显示蓝色,灰色表示计算机已经离线货关机 ...

IP-Guard专栏 5621
上一篇: 编译指令#pragma详解
下一篇: 以战国七雄论地球N雄
computerart
博客等级 码龄20年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值