写在前面的话:
调试当然可以用WinDbg,楼主发现先用DebugDiagnosticTool来分析更棒。但是楼主发现1.2版的DebugDiag有Advanced Analysis,但2.0版本又没有了,非常不解,看来只能用1.2版本。分析前先设置pdb路径,Tools-Options And Settings..,Folders And Search Paths属性页里设置,第一个就是分析时搜索的pdb路径。
如何用WinDbg调试就不说了,满大街就是。此文只记录些常用的命令,不断补充,以备不时之需。只记录简单用法或命令名,具体用法查WinDbg的Debugging Help。http://www.cnblogs.com/killmyday/tag/%E8%B0%83%E8%AF%95/这里面的三篇文章对于调试非托管代码还是很有用的。
.reload:删除所有符号信息并重新加载需要的符号,一般用法“.reoad /f”,“.reload /i xxxx”当模块与pdb不相符时强制加载。
!analyze:自动分析出异常信息,一般用法“!analyze -v”。
lm:列出加载的所有模块和每个模块的符号信息,一般用法“lm”或“lm vm test.dll”显示所有模块或显示指定模块信息信息。
k*:显示堆栈,一般用法“kb”。
dt:显示局部、全局等变量的值,一般用法“dt CString 0x06a6e344”,把0x06a6e344的地址解析为CString类型并显示出来。
!wow64exts.sw:32位托管程序在64位机器上运行,产生的也是64位dump时,就得调用这个命令切换到32位模式下来调试。
.load或.loadby:加载一个新的扩展dll到调试器里,一般用法“.loadby sos clr”,调用C#程序常用命令。
!dso:把当前栈上所有的变量都显示出来,调试C#用,“.loadby sos clr”配合这个命令可显示一些东东。
!clrstack:这个命令不错,调试C#用,可显示堆栈,使用!clrstack可以查看当前的条用堆栈,使用!clrstack -l可以查看当前调用堆栈以及其上的局部变量和值,使用!clrstack -p可以查看当前调用堆栈上的参数变量以及值,使用!clrstack -a可以查看当前堆栈上所有局部变量和参数变量以及值(格式为StackAddress = StackValue)。!clrstack命令只会显示托管代码的调用堆栈,如果想查看完整的调用堆栈可以使用!dumpstack命令。
!EEStack:可打印出所有线程的堆栈信息,如果!clrstack无效(报“Failed to start stack walk: 80070057”),可试着用此命令。注意在64位机器上取32程序的dump时,最好用32位取dump的程序,否则可能!clrstack无用。
x:显示指定模块中的符号,一般用法“x test!*m_*”显示test模块中含m_的符号。
d*:显示给定内存的内容,一般用法“dc 0x06a6e344”显示0x06a6e344处的内容。
!address:显示内存信息,一般用法“!address0x06a6e344”显示0x06a6e344处内在的属性。
dpa或dpu:显示给定内存以ANSI或UNICODE格式编码的字符。
.cls:清屏。
.chain:显示加载的扩展dll。
!cs:显示一个或多个临界区信息,比如“!cs 0x21ba1980”显示0x21ba1980的临界区信息,!cs -l仅显示锁定的临界区。
.ecxr:命令定位当前异常的上下文信息,并显示指定记录中的重要寄存器。