我之前发布本指南是为了回答另一个问题,但该问题和我的答案似乎已被删除.这不是为胆小的人准备的:
- 在服务器上安装Windows调试工具(作为Windows SDK的一部分提供
应用程序运行一段时间后,使用adplus捕获进程的内存转储(使用process Explorer之类的工具查找要转储的正确进程ID非常有用):
ADPLUS -hang -p <process id> -o .
个
This will create a directory containing the memory dump. You can now use windbg, and open the dump file (File -> Open Crash Dump...)
非托管代码的乐趣现在出现了.但是您可以使用名为Son of Strike的工具,它可以理解.NET代码,来查看分配了哪些对象.首先加载SOS:
.loadby sos mscorwks
然后请求它判断托管堆:
!dumpheap -stat
这通常会产生大量输出,但是有两列按类型显示实例数量和消耗的内存量.有些类型您预计会看到很多(例如字符串),但是如果您自己的类型有数千个实例,那么您可能会以某种方式泄漏这些对象.我在过go 遇到的一个问题是将对象中的事件处理程序连接到应用程序中的静电事件-然后该事件就会有一个对每个对象的实时引用.
我从来不记得大部分是怎么工作的,通常指的是这cheat sheet for SOS个
苔丝·费兰德斯有一张good blog英镑的支票,有时还可以报销.NET使用非托管调试器进行调试
例如,a post from last May,详细说明了如果将XmlSerializer
与非默认构造函数一起使用可能会出现的问题.