我对在Visual Studio的调试器中调试C / C ++项目的提示和技巧感兴趣。我最近发现如果你有一个指向某种数据类型的指针,让我们说char * ptr,那么你可以使用如下语法在监视窗口中将它看作一个数组:
ptr,10
这将显示ptr地址中的前10个元素,与定义如下所示的方式相同:
char ptr[10];
您对Visual Studio调试器有哪些其他提示和技巧?
PS:我希望这个问题还没有讨论过。如果你找到类似的帖子,请告诉我。答案 0 :(得分:9)
我非常希望通过 AutoExp.dat 来调整类型和结构的Debugger显示。该文件位于
.. \ Microsoft Visual Studio 9.0 \ Common7 \软件包\调试器\ autoexp.dat
并允许在调试期间定义自己的数据显示模板:
调试时,数据提示和项目 在Watch和Variable窗口中 自动扩展以显示他们的 最重要的元素。扩张 遵循规则给出的格式 在这个文件中。您可以为其添加规则 您的类型或更改预定义 规则。
该文件充满了很好的示例,您可以根据自己的需要轻松调整某些模板,或者为自己的类添加新模板。
答案 1 :(得分:6)
您可以使用一些有点笨拙的代码设置线程的名称。请参阅此article at MSDN。
答案 2 :(得分:6)
您可以使用的最重要提示可能是DebugBreak。 将DebugBreak()放在你的代码中,当它执行时就像点击一个断点。
真正的好处是你可以在其上放置条件,这可能难以设置在常规断点上。学习使用它!
例如,您的程序在摘要某个数据文件时会崩溃。你发现它在某个功能中崩溃,但只有在被称为百万次+之后才会崩溃。 你也已经发现它崩溃了,因为某个变量调用它x的值为1001,但x应该在0到1000之间。所以不要希望幸运地抓住x变大的地方,你会发现每一个x改变的地方。在那之后你发表声明: if(x> 1000)DebugBreak();
是的,您可以使用条件断点执行此操作,但我已经看到一个程序需要1秒钟才能使用三个分支断点执行减慢到15分钟,但是使用DebugBreak在1.5秒内执行。
说完这里有几个有用的建议。在数学上证明你认为错误发生的原因是至少部分时间内发生的实际错误的原因(不太可能有两个错误会产生同样的问题,但它会发生)。我已经看到了一些最愚蠢的修复措施,因为人们“感觉”这是错误的共鸣。确保您的逻辑与几何类中的任何证明一样合理。
第二个建议是,如果你进行实验性修复,它什么都不做。拿出来。
答案 3 :(得分:5)
我在本文中找到的一些其他提示和技巧:
ptr,su -> display ptr as if it was a string of unicode chars. val,hr -> view val as a hresult data val,wc -> view val as a window class val,wm -> view val as a window message
答案 4 :(得分:4)
有些人实际上并没有意识到你可以改变变量值并移动执行点。如果您在您感兴趣的一行代码之后遇到断点,并且想要使用不同的值再次尝试它,那么这非常有用。
答案 5 :(得分:3)
SaraFord的博客非常适合视觉工作室的提示和提示 - Sara Ford's Weblog
答案 6 :(得分:3)
一些调试/观看相关提示:
在Watch窗口中使用以下内容以找出GetLastError()将返回的内容:
@ ERR,小时
如果使用Visual Studio 2003或更早版本,请使用此监视表达式查找std :: vector v的长度:
v._Mylast-v._Myfirst
你也可以列出例如带有此表达式的前5个条目:
v._Myfirst,5
使用STLport时这不起作用,并且在VS> = 2005中使用新表达式可视化器废弃了该方法。
如果要查看函数的返回值,请查看eax寄存器(只需在监视窗口中输入eax)。您甚至可以更改返回的值。如果它是指向字符串或数组的指针,您还可以在“内存”窗口中输入eax以查看基础字符串。