Visual Studio调试器技巧和窍门(针对C/C++项目)

14

我对在 Visual Studio 的调试器中调试 C/C++ 项目有兴趣,希望了解相关的技巧和窍门。最近我发现,如果你有一个指向特定数据类型的指针,比如 char* ptr,那么你可以使用以下语法在观察窗口中将其视为数组:

ptr,10

这将显示从 ptr 地址开始的前 10 个元素,与以下定义方式显示的方式相同:

char ptr[10];

您还知道哪些 Visual Studio 调试器的技巧和窍门呢?

PS:希望这个主题之前没有讨论过。如果您找到类似的帖子,请告诉我。

7个回答

8

我非常喜欢通过 AutoExp.dat 调整调试器显示类型和结构的可能性。该文件位于:

..\Microsoft Visual Studio 9.0\Common7\Packages\Debugger\autoexp.dat

并允许定义自己的模板以在调试期间显示数据:

在调试过程中,数据提示和观察窗口中的项目会自动展开以显示它们最重要的元素。展开遵循此文件中规则给出的格式。您可以为自己的类型添加规则或更改预定义规则。

该文件包含了很多好的示例,您可以轻松地将某些模板适应到自己的需求上,或者为自己的类添加新的模板。


6

您可以使用一段有些笨拙的代码来设置线程的名称。请参阅MSDN上的文章


6
可能你可以使用的最重要的提示是DebugBreak。 在你的代码中加入DebugBreak(),当它执行时就像命中了一个断点。
真正好的是,你可以在它上面设置条件,这些条件可能很难在常规断点上设置。学会使用这个!
例如,当你的程序处理某个数据文件时会崩溃。你发现它在某个函数中崩溃,但只有在调用一百万次以上后才会崩溃。 你还发现它崩溃是因为一个叫做x的变量的值为1001,但x应该在0和1000之间。所以,不要指望幸运地捕捉到x变得太大的地方,而是找到每个改变x的地方。在那之后,你加入这个语句: if(x>1000) DebugBreak();
是的,你可以使用条件断点来实现这一点,但我见过一个程序,它需要1秒才能执行,在添加了三个条件断点后减慢到15分钟,但在使用DebugBreak后只需要1.5秒。
话虽如此,这里有几个有用的建议。数学上证明你认为一个bug发生的原因至少在某些情况下导致了实际的bug(不太可能有两个bug创建相同的问题,但它确实会发生)。我曾经看到一些非常愚蠢的修复措施,因为人们“感觉”这就是bug的原因。确保你的逻辑和几何课堂上的任何证明一样合理。
第二个建议是,如果你放了一个实验性的修复程序,但它没有起作用,请把它拿掉。

这是一条关于防御性编程的好建议,但它并不是针对Visual Studio调试器的特定提示。您可以在任何环境中编写DebugAsserts。 - Nathan Ross Powell

4

有些人实际上并没有意识到可以更改变量的值和移动执行点。如果您在感兴趣的代码行后遇到断点,并且想使用不同的值再次尝试它,这非常有用。


4

这篇文章中提到了一些其他的技巧和窍门:

ptr,su -> 将 ptr 显示为 unicode 字符串。
val,hr -> 将 val 视为 hresult 数据。
val,wc -> 将 val 视为窗口类。
val,wm -> 将 val 视为窗口消息。

3

3
  • 一些调试/监视相关的技巧:

    在监视窗口中使用以下内容来查找 GetLastError() 返回值:

    @ERR,hr

  • 如果您使用 Visual Studio 2003 或更早版本,请使用此监视表达式来查找 std::vector v 的长度:

    v._Mylast-v._Myfirst

    您还可以使用此表达式列出前5个条目:

    v._Myfirst,5

    在使用 STLport 时,此方法不起作用,并且在 VS >= 2005 中已经被新的表达式可视化器所取代。

  • 如果您想查看函数的返回值,请查看 eax 寄存器(只需在监视窗口中输入 eax)。您甚至可以更改返回值。如果它是指向字符串或数组的指针,则还可以在内存窗口中输入 eax 来查看底层字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接