为什么要使用WinDbg而不是Visual Studio(VS)调试器?

63

使用WinDbg与Visual Studio调试器相比的主要原因是什么?

它通常被用作完全替代Visual Studio调试器,还是更多地在需要时使用?

8个回答

71
如果你想知道为什么应该使用Windbg而不是Visual Studio,那么你需要阅读高级Windows调试。每当你需要调试一个非常棘手的问题时,Windbg比Visual Studio拥有更好的技术来解决它。Windbg具有更强大的脚本语言,并允许你编写DLL来自动化解决困难的问题。它将安装gflags.exe,以便在调试内存覆盖时更好地控制堆。你实际上不需要运行安装程序,只需复制文件即可开始使用。它还安装了adsplus.vb,因此您可以对正在运行的进程进行小型转储。它也非常容易设置以执行远程调试。没有什么比能够从自己的办公桌上调试问题更好的了,而不必与测试PC上闪烁的15英寸显示器作斗争。
对于日常代码编写,我使用Visual Studio,但一旦你需要从其他计算机调试问题或发现自己处于非常棘手的情况下,Windbg是唯一的选择。花费一些时间学习Windbg是一个很好的投资。此外,如果你查看崩溃转储,有两个伟大的资源,http://www.dumpanalysis.org/bloghttp://blogs.msdn.com/ntdebugging/default.aspx,他们都使用Windbg进行调试。

13

有些链接已经失效,编辑队列也已满。因此... cmdtree链接的存档URL为: https://web.archive.org/web/20080927030850/http://www.wintellect.com/CS/blogs/jrobbins/archive/2008/09/17/windbg-cmdtree-file-that-eases-some-sos-pain.aspx - AJM
SOS概述链接仍然有效,但现在将重定向到https://learn.microsoft.com/en-us/archive/msdn-magazine/2003/june/bugslayer-sos-it-s-not-just-an-abba-song-anymore,需要在编辑队列清空时更新。 “if broken it is”链接重定向到https://learn.microsoft.com/en-us/archive/blogs/tess/,以及“bunch of ... articles”链接。 - AJM
“一堆文章”的原始链接的存档网址为:https://web.archive.org/web/20081225000002/http://blogs.msdn.com/tess/archive/2006/10/16/net-hang-debugging-walkthrough.aspx” - AJM

6

你没有说明你是在调试本地代码还是托管代码。这不会影响答案,WinDbg对两者都非常有用,但许多人认为在调试.NET应用程序时,WinDbg似乎不那么重要。事实并非如此。作为奖励,通过使用SOS扩展在WinDbg中调试你的.NET应用程序,你可以学到很多关于.NET平台如何工作的知识。在WinDbg中运行(或附加到)你的.NET应用程序,然后输入...

.loadby sos mscorwks

为了确保你加载了正确的扩展版本用于正在使用的CLR版本。然后输入...

!help

请使用SOS扩展来查看可用的命令。

有人开玩笑说微软只有一个开发工具,那就是WinDbg。所有你可能需要的调试工具都在里面或者是在扩展中。当然,其中的一部分功能也可以在更友好的VS界面中使用... :-)


4
如果你设置了一个项目的调试属性并启用了 "非托管调试",你可以将SOS扩展加载到Visual Studio中。启用非托管调试-> 在某个断点处设置断点-> 运行-> 当你命中断点时,打开即时窗口(ctrl + alt + i),然后输入.load sos。有关更多信息,请参见http://blogs.msdn.com/vijaysk/archive/2007/11/15/sos-your-visual-studio.aspx。 - dss539

3

我曾经使用它来处理从NT4.0服务器发送的.dmp文件,因为MSVC无法加载这些旧格式的文件。


3
混合内核调试和远程用户模式调试。
据我所知,Visual Studio仍然无法在我描述为“解决方案”的模式下进行远程调试。这是使用Windbg的一个非常好的理由。
问题:
- 在1394上设置Windbg。您的应用程序在“目标”上运行,Windbg在“主机”上运行。 - 在主机上运行Visual Studio - 通过远程工具使Visual Studio启动您的应用程序 - 进入内核模式Windbg以停止目标 - 等待足够长的时间,以使Visual Studio的TCP连接超时 - 在Windbg中“g”以取消停止目标 - 当远程监视器意识到网络连接已断开时,观察您的应用程序“弹出” - 重新启动您的应用程序:(
解决方案:
- 不要使用Visual Studio。 - 在目标上运行带有“-server”参数的用户模式Windbg - 让目标的Windbg启动您的应用程序。 - 在主机上,启动第二个Windbg并使用“-remote”连接到目标。 - 如果TCP连接断开,只需在主机上启动另一个Windbg实例,就不会丢失任何内容。您的应用程序没有死亡,因为控制用户模式Windbg进程正在目标上运行。
此外,我发现在内核模式和用户模式下都使用同一个调试器更容易。Windbg即使在用户模式下也非常强大,我可以利用自己的Windbg扩展来使用内核模式和用户模式实例。

2

轻量级,可以在客户端机器上不安装直接运行,速度快,可调试内核模式。


2
最新的Visual Studio是否仍然缺少类似于Windbg的“-o”功能,使得调试器能够自动附加到子进程?这对于必须从复杂的.bat文件运行或分叉并退出父进程的应用程序非常有用。

1
我一直很喜欢“wt”这个观察和追踪功能:它会在输出窗口打印出所有函数调用的发生情况。那真是相当酷的东西!

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