Eva*_*van 21
既然你说C#我假设你使用的是Windows平台.
crashdump或者只是转储,是特定时间点的进程的完整内存快照和其他相关系统信息.转储可用于调试程序崩溃,挂起,内存和资源泄漏,可能还有更多我未在此处列出的问题.
在崩溃和挂起的情况下,您想要从崩溃转储中获取的第一个数据将是callstack.这表示崩溃的点或操作被阻止并且从未返回的点,因此程序无所事事.
对于资源泄漏,可以在一段时间内收集进程的多个内存转储,并检查内存中哪些对象增长最多.这可以帮助缩小代码的哪些部分导致泄漏.要了解有关调试特定问题的更多信息,我强烈推荐此博客.
有几种方法可以捕获转储文件.
使用procdump,您可以简单地执行:
c:\>procdump.exe -ma YourProcessName.exe
Run Code Online (Sandbox Code Playgroud)
此命令的结果将是写入c:\的YourProcessName.dmp的完整内存快照.-ma开关指定转储完整的内存映像.如果您正在调试崩溃或挂起,您可能会在没有-ma开关的情况下离开.当你去检查数据结构时,请记住没有完整的内存转储,你可能没有有效的数据.如果没有完整的内存转储,您仍然会有callstack数据,这些数据通常足以导致崩溃和挂起.我通常在硬盘空间方面的错误是便宜的,所以收集完整的转储.
Procdump还会在时间间隔或满足特定条件时自动进行转储.请阅读上面链接中的文档以获取更多信息.我推荐的一个开关是-e.
c:\>procdump.exe -ma -e YourProcessName.exe
Run Code Online (Sandbox Code Playgroud)
而不是立即编写转储,它只会在程序崩溃时写入它.
使用Visual Studio 2010,您可以使用调试器附加到进程并保存转储文件.(请记住,当您调试Visual Studio自动附加的程序时).当您的程序处于"中断状态"(断点,未处理的异常,崩溃)时,Debug菜单将具有选项Save Dump As....然后,您可以将转储保存在任何您想要的位置.
由于您提到了C#,您很可能会收集托管转储文件.最简单的方法是使用Visual Studio 2010.只需打开您创建的转储文件,就像打开任何其他文件一样,然后开始调试.
但是,如果这不是一个选项,您可以始终使用VS2008或WinDbg与SOS扩展.我强烈推荐Visual Studio 2010,因为SOS扩展和WinDbg一般都有相当陡峭的学习曲线.要了解有关SOS的更多信息,请在此处和此处查看这些MSDN文章.
我建议使用Visual Studio或procdump的另一个原因是它们将收集您期望的转储文件.我建议转向清除任务管理器的"创建转储文件工具".原因是它将收集64位转储的32位进程,这些进程难以调试.