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 输出所有的线程

WinDbg调试dmp(查找问题的异常堆栈时出现的 UnhandledExceptionFilter 调用堆栈跟踪中)


3.找到异常的线程,例如下面的死锁(发现大部分函数都在等待临界区,死锁可能行非常大):

WinDbg调试dmp(查找问题的异常堆栈时出现的 UnhandledExceptionFilter 调用堆栈跟踪中)

4.使用命令查看临界区信息: RtlEnterCriticalSection的第三个地址是045ab944(临界区地址), !cs Address 指定要显示的临界区地址。 : !cs 045ab944

WinDbg调试dmp(查找问题的异常堆栈时出现的 UnhandledExceptionFilter 调用堆栈跟踪中)


5.切换到0x00004d0线程: ~~[0x00004d0

WinDbg调试dmp(查找问题的异常堆栈时出现的 UnhandledExceptionFilter 调用堆栈跟踪中)

执行 ~56s 切换到56号线程

6.输入kv,查看线程堆栈

WinDbg调试dmp(查找问题的异常堆栈时出现的 UnhandledExceptionFilter 调用堆栈跟踪中)

7.标识对函数调用的线程 Kernel32! UnhandledExceptionFilter 。 它类似于以下

WinDbg调试dmp(查找问题的异常堆栈时出现的 UnhandledExceptionFilter 调用堆栈跟踪中)

8.在第一个参数的指定位置显示内存内容 Kernel32! UnhandledExceptionFilter 通过 添加 第一个参数 。 此指向 EXCEPTION_POINTERS 结构

WinDbg调试dmp(查找问题的异常堆栈时出现的 UnhandledExceptionFilter 调用堆栈跟踪中)

9.第一个 DWORD 代表异常记录。 若要获取有关异常的类型信息,请请在命令提示符处运行以下:.exr first DWORD from step 6

WinDbg调试dmp(查找问题的异常堆栈时出现的 UnhandledExceptionFilter 调用堆栈跟踪中)

10.第二个 DWORD 是上下文记录。 若要获取上下文的信息,请在命令提示符处运行以下:.cxr second DWORD from step 6

WinDbg调试dmp(查找问题的异常堆栈时出现的 UnhandledExceptionFilter 调用堆栈跟踪中)

11.运行 kv 命令获得实际的异常的调用堆栈

WinDbg调试dmp(查找问题的异常堆栈时出现的 UnhandledExceptionFilter 调用堆栈跟踪中)

可以看到是json出现了问题,抛出了异常,但锁没有释放。