调试进程的转储代码

4
我的C#应用程序占用了太多的工作集内存,我想查看在工作集内存中存在的对象。为了回答这个问题,我转储了进程并创建了一个转储文件。 如何使用转储文件诊断内存泄漏? 但是,当我输入命令“.loadby sos clr”时,Windbg无法加载CLR,因此我无法从Windbg调试文件。而且命令“! dumpheap -stat”和“! threads”也显示“未找到导出线程”。请告诉我一种调试此转储文件并找到对象的方法。请提供一个除VS2013 Ultimate之外的解决方案。

那些无法遵循Windbg方法的人可以使用JustTrace软件来实现此目的。 - user3164883
工作集?不要过于担心工作集。越高越好,因为这意味着它在RAM中,而RAM是快速的。只要Windows决定有足够的RAM来增加工作集,通常就可以了。 - Thomas Weller
4个回答

3

你的目标框架是什么?

.loadby sos clr 

这是.NET 4命令,如果要调试之前的版本,请尝试使用其他方法。
.loadby sos mscorwks

我目前正在使用 .net 4.5。但是正如你所说的,'.loadby sos mscorwks' 似乎有效。为什么 '.loadby sos clr' 不起作用,因为它是 .net 4.5?请给予建议。 - user3164883
在加载clr dlls之前,请尝试以下命令:".cordll -ve -u -l"。它会给出详细的输出,说明为什么无法加载特定的dll。 - Dominik
它显示“CLR DLL状态:无加载尝试”。这是什么意思? - user3164883

3
我建议您使用Psscor2Psscor4扩展(取决于您的应用程序所使用的.NET版本)。设置完调试环境后(安装WinDbg并将Psscor文件复制到其文件夹中),加载转储文件并加载适当版本的Psscor。
.load psscor4

然后执行命令从Microsoft服务器下载符号(如果需要),确保您有网络连接:

!symfix

现在,您应该可以访问大量非常有趣的命令(查找!help以列出它们)。要查看每种类型的内存使用情况,请使用:
!dumpheap -stat

查看总体内存使用情况(iu表示包括未根对象):

!heapstat -iu

您还可以使用VMMap工具来查看进程的总体内存使用情况(而不是内存转储),以了解托管堆消耗了多少内存。


Telerik JustTrace是一个应用程序,它可以为我提供工作集内存中的对象。那些无法使用Windbg进行操作的人可以使用该软件。 - user3164883

3

您需要使用命令".load _FULL_SOS_DLL_PATH_"而不是".loadby sos clr"来加载SOS.DLL,因为通常安装了不同的.NET框架,所以您需要指示WinDbg加载正确的框架...


2

除了WinDbg之外,你可以使用的另一个程序——Debug Diagnostics Tool(来自MSDN),对于初次使用者来说要容易得多:http://www.microsoft.com/en-us/download/details.aspx?id=40336

当我在使用它时,我只需右键单击任务管理器中的进程并创建一个转储文件。


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