了设置数据断点的对话框。
在编辑框中输入一个表达式,当这个表达式的值发生变化时,数据断点就到达。
一般情况下,这个表达式应该由运算符和全局变量构成,例如:在编辑框中输入 g_bFlag这个全局变量的名字,那么当程序中有 g_bFlagg_bFlag 时,程序就将停在这个语句处。
消息断点:VC 也支持对 Windows 消息进行截获。
它有两种方式进行截获:窗口消息处理函数和特定消息中断。
在 Breakpoints 对话框中选择 Messages 页,就可以设置消息断点。
如果在上面那个对话框中写入消息处理函数的名字,那么每次消息被这个函数处理,断点就到达(我觉得如果采用普通断点在这个函数中截获,效果应该一样)。
如果在底下的下拉列表框选择一个消息,则每次这种消息到达,程序就中断。
Watch:VC 支持查看变量、表达式和内存的值。
所有这些观察都必须是在断点中断的情况下进行。
观看变量的值最简单,当断点到达时,把光标移动到这个变量上,停留一会就可以看到变量的值。
VC 提供一种被称为 Watch 的机制来观看变量和表达式的值。
在断点中断状态下,在变量上单击右键,选择 Quick Watch,就弹出一个对话框,显示这个变量的值。
单击 Debug 工具条上的 Watch 按钮,就出现一个 Watch 视图(Watch1Watch2Watch3Watch4),在该视图中输入变量或者表达式,就可以观察变量或者表达式的值。
注意:这个表达式不能有副作用,例如运算符绝对禁止用于这个表达式中,因为这个运算符将修改变量的值,导致软件的逻辑被破坏。
Memory:由于指针指向的数组,Watch 只能显示第一个元素的值。
为了显示数组的后续内容,或者要显示一片内存的内容,可以使用 memory 功能。
在 Debug 工具条上点 memory 按钮,就弹出一个对话框,在其中输入地址,就可以显示该地址指向的内存的内容。
Variables:Debug 工具条上的 Variables 按钮弹出一个框,显示所有当前执行上下文中可见的变量的值。
特别是当前指令涉及的变量,以红色显示。
寄存器:Debug 工具条上的 Registers 按钮弹出一个框,显示当前的所有寄存器的值。
进程控制:VC 允许被中断的程序继续运行、单步运行和运行到指定光标处,分别对应快捷键 F5、F10/F11 和 CTRLF10。
各个快捷键功能如下:快捷键 说明F5 继续运行F10 单步,如果涉及到子函数,不进入子函数内部 F11 单步,如果涉及到子函数,进入子函数内部 CTRLF10 运行到当前光标处。
Call Stack:调用堆栈反映了当前断点处函数是被哪些函数按照什么顺序调用的。
单击 Debug 在工具条上的 Call stack 就显示 Call Stack 对话框。
Call Stack 对话框中显示了一个调用系列,最上面的是当前函数,往下依次是调用函数的上级函数。
单击这些函数名可以跳到对应的函数中去。
其他调试手段系统提供一系列特殊的函数或者宏来处理 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 quotstdafx.hquot行前面的所有代码将被忽略,所以其它头文件应该在这一行后面被包含。
对于.c 文件,由于不能包含 stdafx.h,因此可以通过 Projectsettings 把它的预编译头设置为“不使用”,方法是: 弹出 Project settings 对话框 选择 C/C Category 选择 Precompiled Headers 选择不使用预编译头。
ps: DLL 的调试假设: 要调试 hook.dll hook.h hook.lib1。
建立一个新工程 Test将 hook 整个工程目录拷贝到 Test 目录下2。
在 Test 工程中需要用到 hook.dll 的源文件中或 stdafx.h 中加入 include quot.hookhook.hquot这样在该 源文件中使用quot::quot就可以索引到 hook.h 中所有的导出函数、 变量以及类3。
在 Test 的工程设置-gtLink-gtObject/library modules 中加入 ./hook/debug/hook.lib4。
编译连接好 Test 之后,发现未找到 hook.dll. 这需要设置 path. 可以在工程设置-gtDebug-gtWorking directory 中加入 e:Testhookdebug 也可以在 autoexe.bat 中设置路径5。
通过工程-gtInsert Project into Workspace 将 hook.dsp 工程加入 Test 项目中。
6。
设置 hook 工程为活动工程,在工程gtDebuggtExecutable for Debug session 中加入:e:testdebugtest.exe7。
现在设置断点,按 F5 可以正常调试了注意:当调试的 DLL 被映射到其他的应用.
上一篇:
VC计算机的IP地址自动设置 源程序 论文 可执行程
下一篇:
月入5000,你有什么资格谈生活