使用Visual Studio中的Windbg

7

在 Visual Studio 的调试会话中,是否可以从命令窗口使用 Windbg 命令,例如 !locks.loadby sos mscorwks ?我注意到可以使用 k 打印堆栈跟踪,所以想知道是否有办法访问其他命令。

3个回答

8

可以实现这个功能。

  1. 将Visual studio 2008附加到您的进程以进行调试。
  2. 在某些代码处断点。
  3. 转到立即窗口
  4. 键入!load sos
  5. 现在您可以自由使用任何windbg命令,如!EEHeap、!DumpHeap

有一些条件。您需要在项目属性中启用非托管代码调试。 通常在64位版本中,Studio不支持此功能。

玩得开心。


很酷,谢谢你的回答。你知道我是否可以访问未经管理的Windbg调用,比如锁定或分析吗? - ngoozeff
@ngoozeff:我认为这里只有SOS命令是可行的!如果我错了,请有人纠正。 - ferosekhanj
8
抱歉挑剔一下,那些不是WinDbg命令,而是SOS命令。不幸的是,据我所知,常规的WinDbg命令无法从VS中使用,这使得使用SOS有点困难。此外,VS不支持所有必要的IDebugClient接口,因此在VS中输出的SOS有些嘈杂。 - Brian Rasmussen
2
Brian是正确的,对于这个问题的严格答案是“不”。SOS不是WinDbg。此外,WinDbg有x64版本,而SOS没有,也就是说,如果你想调试x64应用程序而不需要将它们重新编译为32位,则WinDbg是唯一的选择,在VS之外 - Mehdi LAMRANI
6
在VS2013上,“!load sos”失败:“标识符“load”未定义”。 - Werner Henze

4

我已经安装了Visual Studio 2012专业版(更新4)。然而,Windows用户模式调试器传输对我不可见。一些来源声称您必须在VS安装的基础上安装WDK,但是可靠的信息似乎不容易获得。那么,怎么办? - IInspectable
从链接中可以看到:“另一个注意事项是,目前您需要在Visual Studio 11之上安装WDK才能获得调试器集成。” 直到我安装了WDK,它对我也没有起作用。 - Kevin Smyth
1
我可以确认,在Visual Studio之上安装Windows 8.0 WDK确实也安装了Visual Studio集成。现在我可以选择Windows用户模式调试器作为传输方式(或从项目的调试器设置中选择其他调试器)。它似乎运行稳定,尽管对我来说速度较慢。VS调试器中的一些功能缺失(例如Tracepoints),而其他功能已更改(例如设置函数断点的不同语法)。强大的WinDbg扩展命令,如!handle!locks,现在可以从VS GUI(调试器立即窗口)中使用。 - IInspectable
注意:对于Visual Studio 2015,需要WDK 10来支持“Windows用户模式调试器”传输。 - Kevin Smyth

2
从Windows Driver Development Kit (WDK) 8.0开始,Windows调试器已经整合到了Visual Studio中(参见Debugging Environments)。在Visual Studio上安装WDK将允许开发人员从附加到进程对话框中选择多个调试器,或在项目的调试器设置中设置调试引擎。这已经在Visual Studio 2012和2013上进行了验证。根据我阅读的MSDN链接,这也应该适用于WDK 8.0及以上支持的任何其他IDE。
虽然WinDbg提供了很多强大的命令,但也有一些缺点。这个列表并不详尽,仅包含我遇到的问题:
  • 不能同时附加到多个进程。虽然通常不是问题,但如果您确实需要同时调试多个进程,则这非常不幸。Visual Studio调试器可以同时附加到任意数量的进程。
  • WinDbg不会使用您的Visual Studio IDE符号设置(在VS 2012 Update 4上进行了测试)。虽然您可以配置IDE在哪里查找调试符号,但WinDbg不会遵守这些设置。WinDbg将使用_NT_SYMBOL_PATH环境变量和/或通过.sympath设置的配置。
  • 不同的函数断点语法。这是一个小烦恼,因为您无法使用Visual Studio的语法来指定函数断点。这也意味着,使用Visual Studio语法设置的函数断点将被忽略。更令人烦恼的是,当启动调试程序时,您会收到每个警告对话框。
  • 不支持Tracepoints。我已经广泛使用Tracepoints,在调试程序中轻松插入跟踪信息。如果您也在使用Tracepoints,则这可能会证明不仅仅是一个烦恼。

1
windbg的bp命令接受一个命令,在断点被触发时运行,因此您可以模拟跟踪点。例如,bp combase!CoSetErrorInfo "dt combase!CErrorObject %edx; g" - Kevin Smyth
1
你能在VS 2017和WDK(特别是版本1507+)中使用这种方法吗?使用Visual Studio调试用户模式进程页面表示该组合不可用,而当我尝试时(将目标更改为“Localhost”后),我一直收到E_FAIL并显示“无法连接/不支持的操作”!我想确保这不仅仅是我的配置问题。 - OzgurH

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