手机版

分享10个Visual Studio原生开发的调试技巧

时间:2021-11-17 来源:互联网 编辑:宝哥软件园 浏览:

最近偶然看到一篇伊万谢尔巴科夫写的文章,《11个强大的Visual Studio调试小技巧》。本文只介绍了一些关于Visual Studio的基本调试技巧,但还有其他同样有用的技巧。我整理了一些Visual Studio原生开发的调试技巧(至少在VS 2008下)。(如果您在托管代码下工作,调试器将有更多的功能,并且在CodeProject中有关于它们的文章), 下面是我整理的一些小技巧:异常中断|异常观察窗口中伪变量上的Break |观察窗口符号中的伪变量越界后|检查数组的值以避免输入不必要的函数并从代码启动调试器|从代码启动调试器以在输出窗口中打印隔离内存泄漏调试版本|调试版本构建远程调试技巧1:异常中断在调用处理之前, 当异常发生时,可以启动调试器来中断,这允许您在异常发生后立即调试程序。 调用堆栈便于您找到异常的根本原因。tualstudio允许您指定要中断的异常或特殊异常的类型。选择菜单调试例外弹出对话框,您可以指定本机(或托管)例外。除了调试器带来的一些默认异常之外,您还可以添加自己的自定义异常。

以下是引发std:exception异常时调试器中断的示例。

阅读更多:1。抛出异常时如何中断;2.如何添加新的异常;2.“监视”窗口中的伪变量;“监视”窗口或“快速监视”对话框提供了一些特定的变量(调试器可以识别),这些变量称为伪变量。该文档包含以下内容:$ tid-当前线程的线程$ pid——进程ID $cmdline———-启动程序的命令行字符串$ user——运行程序的帐户信息$ registername显示register registername的内容无论如何,关于最后一个错误的伪变量非常有用:$ err——显示最后一个错误的错误代码$ err,HR—显示最后一个错误的错误消息

阅读更多:伪变量提示3:重合出界后检查堆对象。有时,在调试符号超出界限后,您仍然需要检查对象的值。此时,监视窗口中的变量被禁用,并且不能再被检查(或更新),即使对象仍然存在。如果你知道物体的地址,你可以继续完整地观察它。您可以将地址转换为对象类型的指针,并将其放入观察窗口。在下面的示例中,_foo在退出do_foo()后不能再被访问。但是,在将其地址转换为foo*后,您可以继续观察该对象。

提示:检查数组的值如果你正在操作一个大数组(我们假设至少有几百个元素,但可能更少),在Watch窗口中展开数组并在特定范围内找到一些元素是非常麻烦的,因为你必须不断滚动。如果数组是在堆上分配的,您甚至不能在监视窗口中展开数组元素。这个问题是有解决办法的。您可以使用(数组偏移量),count来查看从偏移量位置开始的特定范围内的count元素(当然,这里的数组是您的实际对象)。如果你想看到整个数组,你可以简单地使用array,count。

如果您的数组在堆上,您可以在监视窗口中展开它,但是要查看特定范围的值,用法略有不同:((T*)数组偏移量)、计数(请注意,这种用法对堆上的多维数组也有效)。然而,在这种情况下,t是索引组元素的类型。

如果你使用的是MFC,并且使用它的‘array’容器,比如carray、CDWordArray、CStringaray等等。您当然可以使用相同的过滤方法。此外,您必须检查数组的m_pData成员,这是存储数据的真正缓存。

技巧5:避免输入不必要的函数。大多数情况下,在调试代码时,您可能会输入想要跳过的函数,例如构造函数、赋值操作或其他函数。最困扰我的是CString构造函数。以下是一个例子。当您准备好进入take_a_string()函数时,首先输入CString的构造函数。void take _ a _ string(CString const text){ } void test _ string(){ take _ a _ string(_ T(' sample '));}

幸运的是,您可以告诉调试器要跳过哪些方法、类或整个命名空间。实现它的方法也发生了变化。回到使用VS6的时候,通常是通过autoexp.dat文件指定的。Vistual Studio 2002已更改为使用注册表设置。如果想跳过一些功能,需要在注册表中添加一些值(详情如下):实际位置取决于Vistual Studio的版本和操作系统平台(x86或x64,因为注册表只能在64位Windows下浏览)。值的名称是一个数字,表示规则的优先级;数字越高,优先级越高。该值是正则表达式的REG_SZ值,用于指定如何过滤和执行。为了避免输入任何CString方法,我添加了以下规则:

这样,即使您在上面的示例中强制使用take_a_string(),调试器也会跳过CString的构造函数。详细阅读:如何避免使用Visual C调试器输入函数提示6:从代码启动调试器从代码启动调试器您可能很少需要将调试器附加到程序,但是您不能在附加窗口中这样做(可能是因为中断发生得太快,没有被捕获),并且您不能从一开始就在调试器中启动程序。您可以在程序中生成一个中断,并通过调用internal _degbugbreak()给调试器一个附加它的机会。复制代码如下: void break _ for _ debug(){ _ _ debugbreak();}其实还有其他方法可以做到这一点,比如触发中断3,但这只适用于x86平台(C 64 bit不再支持ASM)。还有DebugBreak()函数,但是不太好用,所以这里建议使用内部方法。复制代码如下: _ _ ASM int 3;当一个程序运行一个内部方法时,它停止运行,你有机会把一个调试器附加到这个进程上。

多读:内部方法_debugbreak在任何时候都离不开Visual Studio 20005/2008的调试。第四部分:调试器设置代码的技巧7:在输出窗口中打印通过调用DebugOutputString,可以在调试器的输出窗口中显示特定的一段文本。没有附加的调试器,该函数什么也不做。

详细阅读:函数OutputDebugString函数OutputDebugString调用机制技巧8:隔离内存泄漏内存泄漏是原生开发中非常重要的问题,检测内存泄漏是一个非常严峻的挑战,尤其是在大型项目中。Vistual Studio可以提供用于检测内存泄漏的报告,其他应用程序(免费或商用)也可以帮助您检测内存泄漏。在某些情况下,当一些内存分配最终会导致泄漏时,您可以使用调试器来中断。但是你必须找到一个可重复的分配号码(虽然这并不容易)。如果可以做到这一点,调试器将在执行程序时被中断。让我们看看下面的代码。分配了八个字节,但分配的内存尚未释放。Visual Studio提供了导致内存泄漏的对象的报告。如果你运行几次,你会发现它总是同一个分配号(341)。复制代码如下: void leak _ some _ memory(){ char * buffer=new char[8];}转储对象-d : \ marius \ VC \ debugingdemos \ debugingdemos . CPP(103): { 341 }正常块,长度为0x00F71F38,8字节。数据:光盘光盘光盘光盘在特定(可再现)位置中断。步骤如下:确保有足够的内存泄漏报告模式(参考使用CRT库检测内存泄漏)。多次运行程序,直到程序运行后,您可以在内存泄漏报告中找到可复制的分配号。例如,(341)在前面的例子中,在程序的开头设置一个断点,这样您就可以尽快完成它。当初始中断发生时,监视窗口的Name列将显示:{,msvcr90d.dll } _ crtBreakAlloc,并在Value列中写入您要查找的位置号以继续调试(F5)程序在执行到指定位置时将停止,您可以使用调用堆栈来引导您查找由该位置触发的代码。按照这些步骤,在前面的示例中,分配的数字(341)可用于识别内存泄漏的原因。

提示:调试发布调试和发布是两个不同的目的。调试配置用于开发,而发布配置顾名思义是作为程序的最终版本,因为它必须严格遵守发布的质量要求,而这个配置包含了中断优化部分调试的设置和调试版本。此外,有时,您必须像调试发行版一样调试发行版。为此,您需要对配置进行一些更改。但是在这种情况下,您不再调试发行版,而是调试和发行版的混合版本。

你还应该做一些事情,必须做以下几点:配置c/c一般调试信息格式应该是“程序数据库(/Zi)”,配置C/C优化优化应该是“disabled(/Od)。”linkerdebuggenerate调试信息应该是“Yes/(DEBUG)”,如图所示:

阅读更多:如何调试发行版Tip 10:远程调试另一个重要的调试是远程调试,这是一个更大的话题,已经被多次提及。这里我只做一个简单的总结:你需要在远程机器上安装远程调试监控。远程调试监控必须以管理员身份运行,用户必须属于管理员组。运行监控时,将会打开一个新服务。此服务的名称必须使用Visual Studio的“附加到进度”窗口中的“限定符”组合框的值。

并且远程机器上的防火墙必须允许Visual Studio和远程调试监控之间的通信。PDB文件是调试的关键。为了让VisualStudio自动加载它们,必须满足以下条件:1)本地PDB文件必须可用(相应的模块应该放置在远程机器的相同路径下)。2)远程计算机上的托管PDB区域性必须可用。远程调试监控下载:Visual Studio 2008 Service Pack 1远程调试器Microsoft Visual Studio 2010远程调试器阅读更多:如何设置远程调试以及如何运行远程调试和监控远程调试。远程调试期间加载调试符号:托管PDB文件的本地:开发人员应该知道如何在Visual Studio远程调试和PDB文件中指定符号位置和加载行为。Ivan Shcherbakov的文章和我的文章中提到的调试技巧在大多数调试问题中都是必不可少的。如果你想了解更多的调试技巧,建议阅读文章中提供的额外阅读资料。原文链接:Marius Bancila翻译:伯乐在线-伯乐在线读者翻译链接:http://blog.jobbole.com/45249/.

版权声明:分享10个Visual Studio原生开发的调试技巧是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。