WinDbg调试dmp(查找问题的异常堆栈时出现的 UnhandledExceptionFilter 调用堆栈跟踪中)
1.使用windbg打开dump文件,同时设置symbols。
如果之前下载过windows的symbols就直接设置symbols path: (windows和程序的pdb)
例如:C:\Symbols;E:\work\技术分享\dump分析\1115服务器无响应dump\gsss\gssssvr
如果之前没有下载过windows的symbos则设置
C:\Symbols; SRV*e:\mylocalsymbols*http://msdl.microsoft.com/download/symbols;E:\work\技术分享\dump分析\1115服务器无响应dump\gsss\gssssvr
2.输入指令 ~*kv 输出所有的线程
3.找到异常的线程,例如下面的死锁(发现大部分函数都在等待临界区,死锁可能行非常大):
4.使用命令查看临界区信息: RtlEnterCriticalSection的第三个地址是045ab944(临界区地址), !cs Address 指定要显示的临界区地址。 : !cs 045ab944
5.切换到0x00004d0线程: ~~[0x00004d0]
执行 ~56s 切换到56号线程
6.输入kv,查看线程堆栈
7.标识对函数调用的线程 Kernel32! UnhandledExceptionFilter 。 它类似于以下
8.在第一个参数的指定位置显示内存内容 Kernel32! UnhandledExceptionFilter 通过 添加 第一个参数 。 此指向 EXCEPTION_POINTERS 结构
9.第一个 DWORD 代表异常记录。 若要获取有关异常的类型信息,请请在命令提示符处运行以下:.exr first DWORD from step 6
10.第二个 DWORD 是上下文记录。 若要获取上下文的信息,请在命令提示符处运行以下:.cxr second DWORD from step 6
11.运行 kv 命令获得实际的异常的调用堆栈
可以看到是json出现了问题,抛出了异常,但锁没有释放。