为什么要使用WinDbg和Visual Studio(VS)调试器?
使用WinDbg和Visual Studio调试器的主要原因是什么?
它通常用作Visual Studio调试器的完整替代品,还是在需要时用作更多替代品。
解决方案
从NT4.0服务器发送.dmp文件时,我已经使用过它。MSVC不会加载这些旧格式的文件。
轻巧,可以运行而无需将其安装在客户端计算机上,速度很快,可以调试内核模式。
如果我们想知道为什么应该在Visual Studio上使用windbg,那么我们需要阅读Advanced Windows Debugging。每当我们需要调试一个真正丑陋的问题时,与Visual Studio相比,windbg拥有更好的技术来进行调试。 Windbg具有更强大的脚本语言,并允许我们编写DLL来自动解决难题。它将安装gflags.exe,它使我们可以更好地控制堆,以调试内存覆盖。
实际上,我们不需要运行安装,只需将文件复制过来并准备就绪即可。它还会安装adsplus.vb,因此我们可以对正在运行的进程进行小型转储。设置执行远程调试也非常容易。没有什么比从我们自己的办公桌上调试问题更好的了,而不是与在测试PC上闪烁的15英寸显示器进行对抗。
对于日常代码编写,我使用Visual Studio,但是一旦我们需要从其他计算机上开始调试问题或者发现自己处于非常丑陋的境地,windbg是唯一的选择。花一些时间学习windbg是一项巨大的投资。另外,如果我们查看崩溃转储,则有两个很棒的资源,即http://www.dumpanalysis.org/blog和http://blogs.msdn.com/ntdebugging/default.aspx,它们使用windbg进行所有调试。
我们没有指定要调试本机代码还是托管代码。它不会影响答案,WinDbg对两者都非常有用,但是许多人认为WinDbg在调试.NET应用程序时不那么重要。不是这样另外,通过在带有SOS扩展名的WinDbg中调试.NET应用,我们可以了解有关.NET平台如何工作的很多知识。在WinDbg中运行(或者添加到).NET应用程序,然后键入...
.loadby sos mscorwks
...以确保我们为使用中的CLR版本加载正确的扩展名。然后输入...
!help
...以查看SOS扩展中可用的命令。
我听说它开玩笑说Microsoft只有一个开发人员工具,它是WinDbg。我们可能想要调试的所有内容都在其中或者扩展中。当然,这些内容的子集也可以在VS中以更友好的UI使用... :-)
这是一些其他帮助使用WinDbg的链接,其中大多数是.NET特有的。
- John Robbins讨论了使用cmdtree创建命令窗口。
- 这是WinDbg / SOS快速备忘单。
- 如果损坏了,请修复它,我们应该有大量WinDbg / Sos相关文章,主要是有关调试ASP.NET的。
- 这是来自MSDN mag的SOS的旧概述。它是关于.NET 1.1的,因此它的年龄正在显示。
混合使用内核调试和远程用户模式调试。
AFAIK,Visual Studio仍然无法以我描述为"解决方案"的模式进行远程调试。这是使用windbg的充分理由。
问题:
- 在1394上设置windbg。应用程序在"目标"上运行。 Windbg在"主机"上运行。
- 在主机上运行Visual Studio
- 让Visual Studio使用远程工具在目标上启动应用程序。
- 进入内核模式windbg停止目标
- 等待足够长的时间以使Visual Studio的TCP连接超时
- 在windbg中使用" g"取消目标
- 当远程监视器意识到网络连接断开时,观察应用程序"弹出"
- 重新启动应用程序:(
解决方案:
- 不要使用Visual Studio。
- 使用" -server"在目标上运行用户模式windbg
- 让目标的windbg启动应用程序。
- 在主机上,启动第二个通过" -remote"连接到目标的windbg。
- 如果TCP连接中断,则只需在主机上启动另一个windbg实例,就不会丢失任何内容。应用没有死,因为控制用户模式的windbg进程正在目标上运行。
此外,我发现在内核模式和用户模式下使用相同的调试器更加容易,即使在用户模式下,windbg的功能也非常强大,而且我可以利用自己的windbg扩展
在内核模式和用户模式实例中。
最新的Visual Studio是否仍然缺少与windbg的" -o"等效项,使调试器自动添加到子进程?对于必须从复杂的.bat文件运行的应用程序或者派生并退出父进程的应用程序非常有用。
我一直喜欢监视和跟踪功能:" wt"
->它将所有发生的函数调用打印到输出窗口。那真是太酷了!