VC补遗之Debug篇

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
【声明】如需复制、传播,请附上本声明,谢谢。原文出处:http://morningspace.51.net/,moyingzz@etang.com

引子

   前阵子因为工作的需要,翻阅了《Visual C++ 6宝典》一书。虽然自己接触VC也有些年头了,可却发现里面也有不少内容是我鲜有了解的,以下是我摘录并整理的部分内容,希望会对经常使用VC却有着和我一样情况的朋友有所帮助,本文取名“补遗”也正是出于此意。当然,这里所选的条目,或许稍有偏向,因为毕竟是从自己的角度出发,摘录了自认为容易忽略的内容。如果,你需要了解此处未有提及的其他内容,请查阅相关书籍。

调试应用程序前所要做的必要设置

   Project Settings->C/C++选项卡->General Category

  • Debug info选择Program Database for Edit and Continue
  • Optimizations选择Disable(Debug)
  • 若不选择Generate browse info,可以节省编译时间

   Project Settings->C/C++选项卡->Code Generation Category

  • Use run-time library选择Debug库(比如:Debug Multithreaded DLL)

   Project Settings->Link选项卡->General Category

  • 选择Generate debug info

   如果调试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检测内存泄漏。方法:

   如果不需要完全dump在两次调用Checkpoint之间被分配的所有对象,则:

   无法使用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 。步骤:

  • 在远程机器上运行Msvcmon.exe,选择Network(TCP/IP),选择Settings设置目标机器的名称,再选择Connect
  • 在远程机器上运行要调试的程序
  • 在本地机器上运行Visual Studio,选择Build->Debugger Remote Connection打开Remote Connection,选择Network(TCP/IP),选择Settings设置目标机器的名称
  • 按F5开始调试程序

   远程调试的主要优点是应用程序运行在一个不会因为出现调试程序而受影响的机器上,适合于调试涉及显示、键盘、音频驱动等程序。同时,也适合于调试debug版能正常运行而release版不能正常运行的程序。

   (待续)

Delay Load dll(转) One of the coolest new features in Visual C++® 6.0 is the /DELAYLOAD linker option. Executables that use the /DELAYLOAD option don't implicitly link to the DLLs that you specify ... 阅读详情

相关推荐

VC补遗Debug (转)

   作者: 晨光(Morning)

1065

[转载]VC补遗之Profile

作者: 晨光(Morning) 关键字: VC  Profile 性能优化  来源: 原作 【声明】如需复制、传播,请附上本声明,谢谢。原文出处:http://morningspace.51.net/,moyingzz@etang.com Profile的作用   帮助你分析并发现程序运行的瓶颈,找到耗时所在,同时也能帮助你发现不会被执行的...

weixin_30488085的博客 118

VC补遗之Profile

导读:   VC补遗之Profile  作者: 晨光(Morning) 关键字: VC  Profile 性能优化  来源: 原作 【声明】如需复制、传播,请附上本声明,谢谢。原文出处:http://morningspace.51.net/,moyingzz@etang.com    (续) Profile的作用  帮助你分析并

xu的blog 1329

VC Debug 技巧

VC Debug 技巧前阵子因为工作的需要,翻阅了《Visual C++ 6宝典》一书。虽然自己接触VC也有些年头了,可却发现里面也有不少内容是我鲜有了解的,以下是我摘录并整理的部分内容,希望会对经常使用VC却有着和我一样情况的朋友有所帮助,本文取名“补遗”也正是出于此意。当然,这里所选的条目,或许稍有偏向,因为毕竟是从自己的角度出发,摘录了自认为容易忽略的内容。如果,你需要了解此处未有提及的其他内容,请查阅相关书籍。<br /><br />调试应用程序前所要做的必要设置<br /><br />Projec

Augusdi的专栏 2131

VC补遗之PROFILE (转)

Profile的作用   帮助你分析并发现程序运行的瓶颈,找到耗时所在,同时也能帮助你发现不会被执行的代码。从而最终实现程序的优化。 Profile的组成    Profile包括3个命令行工具:PREP,PROFILE,PLIST。可以以命令行方式运行Profile,其过程是:PREP读取应用程序的可执行文件并生成一个.PBI文件

Whose_Utopia的专栏 541

补遗之volatile

C中volatile关键字在程序操作变量时,强制读写变量所在内存,以阻止编译器对某些特殊变量的错误优化。反过来,只有靠程序员用volatile过滤一些特殊情况后,编译器才能大胆优化。volatile作用可总结为:阻止三种情形下的两种编译器优化。 两种编译器优化     a. 数据流分析优化:编译器分析程序中变量在哪里赋值、哪里使用、哪里失效,根据分析结果消除多余的变量读取和赋值步骤,如:

半山茶馆 974

引用 VC Debug 技巧(转)

引用 charles_yang 的 VC Debug 技巧(转)前阵子因为工作的需要,翻阅了《Visual C++ 6宝典》一书。虽然自己接触VC也有些年头了,可却发现里面也有不少内容是我鲜有了解的,以下是我摘录并整理的部分内容,希望会对经常使用VC却有着和我一样情况的朋友有所帮助,本文取名“补遗”也正是出于此意。当然,这里所选的条目,或许稍有偏向,因为毕竟是从自己的角度出发,摘录了自认为容易忽

haibianfeng的专栏 526

VC调试

<br />【一】参考文档<br />        1.《VC调试_解密版.pdf》<br />       <br /> <br />【二】知识摘录<br />       <br />1.问:VC调试选项卡中的“工作目录”:<br />      答:<br />2.Profiler能够识别应用程序的瓶颈,即找到降低程序执行速度的代码和有关模块,为此需要在"工程/设置/Link"下勾选Profiling。<br />VC补遗之Profile<br /><br />Profile的作用<br /> 帮

ZYH217_808的专栏 516

关于字符串的用法和转换补遗

1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include就可以使用CString了。2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:         WCH

menker的专栏 773

VC使用的文章(转)

VC补遗之Profile  作者: 晨光(Morning) 关键字: VC  Profile 性能优化  来源: 原作 【声明】如需复制、传播,请附上本声明,谢谢。原文出处:http://morningspace.51.net/,moyingzz@etang.com    (续) Profile的作用   帮助你分析并发现程序运行的瓶颈,找

Exist is true 959
上一篇: 关于MVC的一点启示
下一篇: VC补遗之Profile篇
thesecondwoodstock
博客等级 码龄25年 10粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值