【转】堆栈跟踪中收到一个UnhandledExceptionFilter调用时,如何查找问题异常堆栈

定义没有异常处理程序来处理引发的异常时调用UnhandledExceptionFilter函数。函数通常将异常传递到捕获并处理它所尝试的 Ntdll.dll 文件。

在某些情况下,在其中存在的进程内存快照,您可以看到一个线程持有的锁点的线程调用UnhandledExceptionFilter函数。在这些情况下,您可以按照本文来标识导致异常的 DLL 中的步骤。

通过使用 Windbg.exe 打开转储文件

下载并安装调试程序。若要下载调试程序,请访问下面的 Microsoft 网站:
Microsoft 调试工具
http://www.microsoft.com/whdc/devtools/ddk/default.mspx
打开调试程序,文件的安装位置的文件夹,然后双击Windbg.exe启动调试程序。
在文件菜单上,单击打开崩溃转储(或按 CTRL + D),然后选择您想要查看的转储文件。
使用 Windbg.exe 来识别异常堆栈

在 Windbg.exe,打开.dmp 文件的过程。
请确保您正确位置指向的符号路径。有关如何执行此操作的详细信息,请访问下面的 Microsoft 网站:
如何获取符号
http://www.microsoft.com/whdc/devtools/ddk/default.mspx
在命令提示符下键入~ * kb列出所有进程中的线程。
标识函数Kernel32 到执行调用的线程 !UnhandledExceptionFilter。它看起来类似于下面:

120  id: f0f0f0f0.a1c   Suspend: 1 Teb 7ff72000 Unfrozen
ChildEBP RetAddr  Args to Child
09a8f334 77eb9b46 0000244c 00000001 00000000 ntdll!ZwWaitForSingleObject+0xb [i386\usrstubs.asm @ 2004]
09a8f644 77ea7e7a 09a8f66c 77e861ae 09a8f674 KERNEL32!UnhandledExceptionFilter+0x2b5
[D:\nt\private\windows\base\client\thread.c @ 1753]
09a8ffec 00000000 787bf0b8 0216fe94 00000000 KERNEL32!BaseThreadStart+0x65 [D:\nt\private\windows\base\client\support.c @ 453]

切换到该线程 (在此示例中,该线程是"~ 120s")。

通过Kernel32 的第一个参数指定的位置中显示的内存内容 !UnhandledExceptionFilter使用dd第一个参数。这将指向的EXCEPTION_POINTERS结构。

0:120> dd 09a8f66c
09a8f66c 09a8f738 09a8f754 09a8f698 77f8f45c
09a8f67c 09a8f738 09a8ffdc 09a8f754 09a8f710
09a8f68c 09a8ffdc 77f8f5b5 09a8ffdc 09a8f720
09a8f69c 77f8f3fa 09a8f738 09a8ffdc 09a8f754
09a8f6ac 09a8f710 77e8615b 09a8fad4 00000000
09a8f6bc 09a8f738 74a25336 09a8f6e0 09a8f910
09a8f6cc 01dc8ad8 0d788918 00000001 018d1f28
09a8f6dc 00000001 61746164 7073612e 09a8f71c 

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

.exrfirst DWORD from step 6

0:120> .exr 09a8f738
ExceptionAddress: 78011f32 (MSVCRT!strnicmp+0x00000092)
ExceptionCode: c0000005
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 00000000
Parameter[1]: 00000000
Attempt to read from address 00000000 

第二个 dword 值是上下文记录。要获取的上下文信息,请在命令提示符处运行以下命令:

.cxrsecond DWORD from step 6

0:120> .cxr 09a8f754
eax=027470ff ebx=7803cb28 ecx=00000000 edx=00000000 esi=00000000 edi=09a8fad4
eip=78011f32 esp=09a8fa20 ebp=09a8fa2c iopl=0 nv up ei ng nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010286
MSVCRT!strnicmp+92:
78011f32 8a06 mov al,[esi] 

运行kv命令以获取实际的异常的调用堆栈。这有助于您识别可能不能正确处理过程中的实际问题。

0:120> kv
ChildEBP RetAddr Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
09a8fa2c 780119ab 09a8fad4 00000000 09a8faa8 MSVCRT!strnicmp+0x92
09a8fa40 7801197c 09a8fad4 00000000 6d7044fd MSVCRT!stricmp+0x3c
09a8fa80 6e5a6ef6 09a8fad4 2193d68d 00e5e298 MSVCRT!stricmp+0xd
09a8fa94 6d7043bf 09a8fad4 09a8faa8 0000001c IisRTL!CLKRHashTable::FindKey+0x59 (FPO: [2,0,1])
09a8faac 749fc22d 09a8fad4 01d553b0 0000001c ISATQ!CDirMonitor::FindEntry+0x1e
(FPO: [Non-Fpo]) [D:\nt\private\inet\iis\svcs\infocomm\atq\dirmon.cpp @ 884]
09a8fac4 749fd1cb 09a8fad4 09a8fb10 525c3a46 asp!RegisterASPDirMonitorEntry+0x6e
(FPO: [EBP 0x09a8fb08] [2,0,4]) [D:\nt\private\inet\iis\svcs\cmp\asp\aspdmon.cpp @ 534]
09a8fb08 749fcdd6 00000000 09a8fcbc 018d1f28 asp!CTemplateCacheManager::RegisterTemplateForChangeNotification+0x8a
(FPO: [Non-Fpo]) [D:\nt\private\inet\iis\svcs\cmp\asp\cachemgr.cpp @ 621]
09a8fb3c 74a08bfe 00000000 000000fa 74a30958 asp!CTemplateCacheManager::Load+0x382
(FPO: [Non-Fpo]) [D:\nt\private\inet\iis\svcs\cmp\asp\cachemgr.cpp @ 364]
09a8fc68 74a0d4c9 04c12518 018d1f28 09a8fcbc asp!LoadTemplate+0x42
(FPO: [Non-Fpo]) [D:\nt\private\inet\iis\svcs\cmp\asp\exec.cpp @ 1037]
09a8fcc0 74a2c3e5 00000000 0637ee38 09a8fd58 asp!CHitObj::ViperAsyncCallback+0x3e8
(FPO: [Non-Fpo]) [D:\nt\private\inet\iis\svcs\cmp\asp\hitobj.cpp @ 2414]
09a8fcd8 787c048a 00000000 77aa1b03 01e91ed8 asp!CViperAsyncRequest::OnCall+0x3f
(FPO: [Non-Fpo]) [D:\nt\private\inet\iis\svcs\cmp\asp\viperint.cpp @ 194]
09a8fce0 77aa1b03 01e91ed8 77a536d8 00000000 COMSVCS!STAActivityWorkHelper+0xa
(FPO: [1,0,0])
09a8fd24 77aa1927 000752f8 000864dc 787c0480 ole32!EnterForCallback+0x6a
(FPO: [Non-Fpo]) [D:\nt\private\ole32\com\dcomrem\crossctx.cxx @ 1759]
09a8fe50 77aa17ea 000864dc 787c0480 01e91ed8 ole32!SwitchForCallback+0x12b
(FPO: [Non-Fpo]) [D:\nt\private\ole32\com\dcomrem\crossctx.cxx @ 1644]
09a8fe78 77aa60c1 000864dc 787c0480 01e91ed8 ole32!PerformCallback+0x50
(FPO: [Non-Fpo]) [D:\nt\private\ole32\com\dcomrem\crossctx.cxx @ 1559]
09a8fed4 77aa5fa6 04f2b4c0 787c0480 01e91ed8 ole32!CObjectContext::InternalContextCallback+0xf5
(FPO: [Non-Fpo]) [D:\nt\private\ole32\com\dcomrem\context.cxx @ 3866]
09a8fef4 787bd3c3 04f2b4c0 787c0480 01e91ed8 ole32!CObjectContext::DoCallback+0x1a
(FPO: [Non-Fpo]) [D:\nt\private\ole32\com\dcomrem\context.cxx @ 3746]
09a8ff24 787bf373 0216fb3c 00000007 09a8ffec COMSVCS!STAActivityWork::DoWork+0x73
(FPO: [0,4,2])
09a8ffb4 77e8758a 0216fe94 0216fb3c 00000007 COMSVCS!STAThread::STAThreadWorker+0x2bb
(FPO: [EBP 0x09a8ffec] [1,31,4])
09a8ffec 00000000 787bf0b8 0216fe94 00000000 KERNEL32!BaseThreadStart+0x52
(FPO: [Non-Fpo]) [D:\nt\private\windows\base\client\support.c @ 451]

http://support.microsoft.com/kb/313109/zh-cn

【转】堆栈跟踪中收到一个UnhandledExceptionFilter调用时,如何查找问题异常堆栈

时间: 2024-10-25 09:21:00

【转】堆栈跟踪中收到一个UnhandledExceptionFilter调用时,如何查找问题异常堆栈的相关文章

每天进步一点点——Linux系统中的异常堆栈跟踪简单实现

转载请说明出处:http://blog.csdn.net/cywosp/article/details/25002201 在Linux中做C/C++开发经常会遇到一些不可预知的问题导致程序崩溃,同时崩溃后也没留下任何代码运行痕迹,因此,堆栈跟踪技术就显得非要重要了.本文将简单介绍Linux中C/C++程序运行时堆栈获取,首先来看backtrace系列函数--使用范围适合于没有安装GDB或者想要快速理清楚函数调用顺序的情况 ,头文件execinfo.h int backtrace (void **

JVM中常用堆栈跟踪内建指令

在使用Java的程序中难免会遇上程序异常的现象,此时就可以使用JDK下的jstack和jmap来跟踪观察JVM中的内存堆栈信息用以分析,不过注意的是如果是在windows版本或者是开源版中一般都是没有的,如果需要使用需要安装相应的开发调试工具,下面就简单的说一说: jstack 一般而言之后跟着都是Java程序运行的pid或者是相应的Java代码文件,如:jstack $pid,平时可以把相关的堆栈信息再导出到某一个文件中正用以进一步观察,如:jstack $pid > file.dump jm

C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)

BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 :数据段(data segment)通常是指用来存放程序中 已初始化 的 全局变量 的一块内存区域.数据段属于静态内存分配. 代码段: 代码段(code segment/text segment)通常是指用来存放 程序执行代码 的一块内存区域.这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于 

程序运行中(BSS段、数据段、代码段、堆栈)

程序运行中(BSS段.数据段.代码段.堆栈) BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 :数据段(data segment)通常是指用来存放程序中 已初始化 的 全局变量 的一块内存区域.数据段属于静态内存分配. 代码段: 代码段(code segment/text segment)通常是指用来存放 程序执行代码 的一块内存区域.这部分区域的大小

GDB堆栈跟踪与汇编调试

GDB堆栈跟踪与汇编调试 分析过程 ?使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编 出现错误:fatal error 这时需要下载安装库文件 命令:sudo apt-get install libc6-dev-i386 之后再进行一次操作就可以产生汇编了 ?使用gdb gdb1指令打开gdb调试器 ?使用break main指令在main函数处设置断点,并记得先用r指令运行代码,可以看到运行时在main函数位置停了下来,否则会出现如图的

解码混淆过的堆栈跟踪信息

当混淆后的代码输出一个堆栈信息时,方法名是不可识别的,这使得调试变得很困难,甚至是不可能的.幸运的是,当ProGuard运行时,它都会输出一个<project_root>/bin/proguard/mapping.txt文件,而这个文件中包含了原始的类,方法和字段名被映射成的混淆名字. retrace.bat脚本(Window)或retrace.sh脚本(Linux,Mac OS X)可以将一个被混淆过的堆栈跟踪信息还原成一个可读的信息.它位于<sdk_root>/tools/pr

java中,一个简单但出错率又大的‘加法’题,1+1+&#39;1&#39;+1+1+1+1+&quot;1&quot;=?

1+1+'1'+1+1+1+1+"1"=? 结果是多少?很多人看了题之后,可能会说结果是71.  当然有的童鞋可能会说很简单,放工具里运行一下就知道结果了,如果不运行代码,你会得出一个什么样的结果呢? 如果告诉你答案是551,会迷惑么?怎么会得出551? 下面我们来看看怎么算的: 1.我们大家都知道1 .'1'."1"的区别,1 表示一个int类型,’1'是表示一个char类型,"1" 表示一个字符串类型. 2.1+1+'1'+1+1+1+1+&

运动目标跟踪中kalman滤波器的使用

目标跟踪的kalman滤波器介绍 Kalman滤波器是通过前一状态预测当前状态,并使用当前观测状态进行校正,从而保证输出状态平稳变化,可有效抵抗观测误差.因此在运动目标跟踪中也被广泛使用.在视频处理的运动目标跟踪里,每个目标的状态可表示为(x,y,w,h),x和y表示目标位置,w和h表示目标宽高.一般地认为目标的宽高是不变的,而其运动速度是匀速,那么目标的状态向量就应该扩展为(x,y,w,h,dx,dy),其中dx和dy是目标当前时刻的速度.通过kalman滤波器来估计每个时刻目标状态的大致过程

ZeroMQ接口函数之 :zmq_msg_recv - 从一个socket中接受一个消息帧

ZeroMQ 官方地址 :http://api.zeromq.org/4-2:zmq_msg_recv zmq_msg_recv(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_msg_recv - 从一个socket中接受一个消息帧 Synopsis int zmq_msg_recv (zmq_msg_t *msg, void *socket, int flags); Description zmq_msg_recv()函数和zmq_recvmsg(3)函数是完全相同的,