2008-10-20 38 views
15

我对调试Visual Studio调试器中的C/C++项目的提示和技巧感兴趣。最近我发现,如果你有一个指针指向一个特定的数据类型,让我们说的char * PTR,那么你可以使用语法如认为这是在监视窗口中的数组:Visual Studio调试器提示和技巧(针对C/C++项目)

 
ptr,10 

这将显示从PTR地址的前10个元素,以同样的方式,因为它会显示如果定义是:

 
char ptr[10]; 

其他的技巧和窍门你知道有关Visual Studio调试器是什么? PS:我希望这个话题还没有被讨论过。如果您找到类似的帖子,请告诉我。

回答

9

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

.. \微软的Visual Studio 9.0 \ Common7 \包\调试\ autoexp.dat

,并允许在调试过程中定义数据的显示自己的模板:

调试时,数据提示和监视项目 和可变窗口 自动展开,以显示自己的 最重要的元素。扩展 遵循此文件中的规则 给出的格式。您可以为您的类型添加规则 或更改预定义的 规则。

该文件充满了很好的例子,您可以轻松地调整某些模板以满足自己的需要,或者为自己的类添加新的模板。

6

你可以使用一些有些尴尬的代码来设置你的线程的名字。看到这个article at MSDN

4

有些人并未意识到您可以更改变量值并移动执行点。如果你在你感兴趣的一行代码之后点击一个断点,并且你想用不同的值再次尝试它,这是非常有用的。

6

也许你可以用最重要的秘诀是的DebugBreak。 把DebugBreak()放到你的代码中,当它执行时就像打断点一样。

真正好的一点是,你可以在它上面添加条件语句,这可能很难在常规断点上设置。学会使用这个!

例如,您的程序在消化某个数据文件时会崩溃。你发现它在某个函数中崩溃,但只有在它被称为一百万次+之后。 你也发现它正在崩溃,因为某个变量称它x的值为1001,但x应该在0到1000之间。因此,不是希望幸运地赶上x变大的地方,而是找到x变化的每个地方。在此之后,您将声明: if(x> 1000)DebugBreak();

是的,你可以使用条件断点来做到这一点,但是我看到一个程序需要1秒钟的时间用三个coniditional断点执行减慢到15分钟,但是在DebugBreak执行1.5秒。

说了这里有几个有用的建议。数学上证明自己,你认为错误是发生的原因占实际发生错误的时间至少部分(不可能有两个错误创造了同样的问题,但它发生)。我已经看到了一些最愚蠢的修复,因为人们“觉得”这是bug的共鸣。确保你的逻辑和几何类中的任何证明一样健全。

如果你把在实验修复,它什么都不做第二项建议。把它拿出来。

+0

这是防御性编程一个很好的提示,但它不是一个尖具体到Visual Studio调试器。您可以在任何环境下编程DebugAsserts。 – 2009-04-08 22:43:20

3
  • 一些调试/手表相关的提示:

    使用在监视窗口下面找出什么GetLastError函数()将返回:

    @ ERR,人力资源

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

    v._Mylast-v._Myfirst

    您还可以列出例如第一5个条目与此表达式:

    v._Myfirst,5

    这不使用时的STLport,并且在VS> = 2005废弃用新的表达可视化工具的方法工作。

  • 如果你想看到一个函数的返回值,看看EAX寄存器(只在监视窗口中输入EAX)。你甚至可以改变返回的值。如果它是一个指向字符串或数组的指针,那么也可以在Memory窗口中输入eax来查看底层字符串。

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