如果调试DLL,则需要:Project Settings->Debug选项卡->General Category
Executable for debug session填入加载和访问DLL的程序的名称(比如:为了调试ActiveX控件,你可以使用VC的实用程序tstcon32.exe)
Variables窗口
Variables窗口包含三个选项卡。Auto选项卡显示运行程序当前行以及上一行中所使用的变量;Locals选项卡显示在当前执行的函数内具有局部定义的所有变量(包括局部变量和传入函数的参数);this选项卡显示this指针当前所指向的对象内部的成员变量
你可以通过Variable窗口修改简单类型变量的当前值(比如:int、double),只要在窗口中双击该值就可以修改了。
Watch窗口
可以在Watch窗口中手工将表达式输入到Name域中,或者拖拽表达式,或者从剪贴板粘贴。Watch窗口也可以修改简单类型的变量的值。
Memory窗口
可以查开所有调试进程的地址空间中的内存内容。可以按字节格式、字格式和双字格式显示内存内容。为显示具体位置处的存储内容,要在Memory窗口的Address栏内键入表达式。Memory窗口可能显示指定地值之前的内存内容,不过它会将光标定位在表达式对应的地址处。
Disassembly窗口
Set Next Statement功能可以更改处理器的指令指针,以为处理器选择需要执行的下一条指令。但是,如果你设置的语句在另一个函数中或者你不能正确维护堆栈,则后果是不可预测的,通常正在调试的程序会崩溃。
调试多线程
调试多线程应用程序时,可以通过Debug菜单(调试运行时才可见)下的Threads功能,打开Threads对话框,从而将焦点设置给程序内的一个具体线程。还可以挂起、恢复某个线程
调试异常
通过Debug菜单(调试运行时才可见)下的Exceptions功能,打开Exceptions对话框,指定调试运行时,程序对异常的响应情况(包括:Stop
always和Stop if not handled两种)。
简单调试技巧
- 使用AfxMessageBox
如果调试程序窗口的出现干扰了应用程序的执行,或者错误出现在release版程序中,则可以使用AfxMessageBox输出你所感兴趣的信息。这类似于早先用printf输出调试信息的方法。
- 使用TRACE宏:
MFC提供了宏TRACE、TRACE0、TRACE1、TRACE2、TRACE3,用以生成调时输出。它们将调试信息输出到afxDump对象,该变量是MFC的CDumpContext类的一个实例,它将信息发送到Output窗口。尽量使用TRACE0~TRACE3,因为它们需要的存储空间小于TRACE。TRACE0输出一个字符串,TRACE1输出字符串并可附带一个变量,TRACE2可以附带两个变量,TRACE3可以附带三个。在创建Unicode应用程序时,TRACE必须使用_T宏格式化字符串,而TRACEn不需要。release版应用程序将忽略所有的TRACE和TRACEn宏。
- 使用断言:
除了ASSERT外,ASSERT_VALID宏可以验证一个指向CObject派生类对象的指针的有效性。release版应用程序将忽略所有的ASSERT和ASSERT_VALID宏。
- 使用Dump
CObject类中包含Dump()成员函数,它将内容通过afxDump对象输出到Output窗口。你可以在派生类中重载它。
- 内存泄漏:
可以使用CMemeoryState检测内存泄漏。方法:
- 在你感兴趣的那段代码之前,创建CMemeoryState对象
- 调用Checkpoint函数
- 在你感兴趣的那段代码之后,调用DumpAllObjectsSince函数
如果不需要完全dump在两次调用Checkpoint之间被分配的所有对象,则:
- 在你感兴趣的那段代码之前,创建CMemeoryState对象msBeforeCall, msAfterCall,
msDiffBA
- 调用msBeforeCall的Checkpoint函数
- 在你感兴趣的那段代码之后,调用msAfterCall的Checkpoint函数
- 调用msDiffBA的Difference函数对msBeforeCall和msAfterCall进行比较
- 若两者存在差异,则调用msDiffBA的DumpStatistics
无法使用CMemoryState对malloc/free,GlobalAlloc/GlobalFree,LocalAlloc/LocalFree进行检测。
- 使用MFC Tracer
MFC Tracer(文件名:tracer.exe),可以启用或禁用部分或全部MFC跟踪调试信息(TRACE和TRACEn宏)。
远程调试
远程调试允许你调试运行在与你机器相连的其他机器上的程序。远程机器必须运行Visual C++ Debug Monitor(Msvcmon.exe,和MSDEV.exe在同一个目录下),为了运行Msvcmon.exe,远程机器上必须有:
Msvcrt.dll、Tln0t.dll、Dm.dll、Msvcp60.dll、Msdis100.dll 。步骤: