详细说说在Vistual studio IDE里使用SOS.dll扩展调试程序

通常,我写的问题只在生产环境中表现出来,每次执行某个操作时,您不能在受控开发环境中真实再现这些问题。在这些情况下,您需要使用windbg之类的工具来收集转储并进行事后调试。Windbg对于这些类型的问题非常有效,但它有其缺点,因为它不是真正的托管调试器,所以在.NET代码中设置断点或单步执行代码,甚至像在visual Studio这样的托管调试器中那样以可视方式检查对象都要困难得多。
另一方面,Visual Studio不允许您像windbg那样进行事后调试,而且没有简单的方法可以查看进程中加载的域的信息或查看.net堆上的对象的信息。
我的同事遇到了一个很容易重现的问题,但他需要两个世界,即从代码到一个特定的点,可视化地查看堆栈上的对象,同时他需要查看堆上的内容,因此他求助于附加两个调试程序,管理visual studio调试和windbg调试与sos一起原生以查看托管堆。这是相当恶劣的,有一个更容易的方法来结合这两个世界。。。在Visual Studio中使用sos进行调试。

有很多网友看了我的《VisualStudio中集成扩展调试SOS》,说不够细,确实那篇随笔只是大致讲了主要的步骤,很多的朋友是在卡在第二步,也就是对立即窗口的使用。

下面我将使用Visual Studio来向您展示如何在其中加载sos并运行sos命令。

步骤一:为项目启用本机调试

为了加载类似于SOS.dll文件您必须在本机模式下进行调试,因此在启动调试器之前,请进入项目上下文菜单上的Project/Properties/Debug,并选中“启用非托管代码调试”复选框。

 

步骤二:调试并中断

像在Visual Studio中一样调试问题,直到重现问题为止。
中断进程(调试菜单/全部中断)

步骤三:加载SOS.dll扩展

为了装载sos.dll文件你必须打开“立即”窗口(Debug/Windows/Immediate or Ctrl+D, I),并输入如下命令:

.load C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\sos.dll

若执行成功,会输出:

extension C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\sos.dll loaded

个人试验,VS2013里,加载2.0版本成功率高,4.0版本多半失败

步骤四:用sos扩展命令开始调试你的问题

现在我们可以用sos.dll文件.

这里有一些说明:不能运行本地命令,如kb、dc等;你不能跑~*e这意味着你不能跑~*e!clrstack查看所有线程上的堆栈但是,您可以在sos.dll扩展的!dumpdomain, !dumpheap等。

 为特定于线程的命令切换线程上下文,如!clrstack和!dumpstackobjects可以打开threads窗口(debug/windows/threads)并双击要切换到的线程。稍后我将展示一个例子。。。

 

我知道很多人开始使用windbg有点困难,因为它意味着你需要学习一个全新的工具集,而且非常诚实的说,windbg不像visual studio那样“适合初学者”,然后,它主要用于事后调试,这对大多数人来说并不是一项日常任务。希望通过上面的信息你仍然可以开始使用sos.dll文件在舒适熟悉的visual studio调试环境中。

 

posted on 2020-06-29 08:29  活着的虫子  阅读(456)  评论(1编辑  收藏  举报

导航