jans2002的博客

专注 专心 专业

如何根据程序崩溃时的DMP文件使用WinDbg查找调用堆栈

 

HOW TO: 查找问题的异常堆栈时出现的 UnhandledExceptionFilter 调用堆栈跟踪中

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

察看本文应用于的产品

本页

展开全部 | 关闭全部

概要

没有异常处理程序定义处理引发的异常时,将调用该 UnhandledExceptionFilter 函数。 通常,该函数会将异常传递给在 Ntdll.dll 为文...

没有异常处理程序定义处理引发的异常时,将调用该 UnhandledExceptionFilter 函数。 通常,该函数会将异常传递给在 Ntdll.dll 为文件其中捕获,并尝试处理设置。
在进程的内存快照所在某些情况下,可以看到锁定点保存到线程的线程的调用 UnhandledExceptionFilter 函数。 在这的种情况下您可以按照本文以确定导致此异常的 DLL。

回到顶端

使用 Windbg.exe 打开转储文件
  1. 下载并安装调试程序。 要下载调试程序,请访问下面的 Microsoft 网站:

    Microsoft 调试工具
    http://www.microsoft.com/whdc/devtools/ddk/default.mspx (http://www.microsoft.com/whdc/devtools/ddk/default.mspx)

  2. 打开安装调试程序,文件夹,然后双击 Windbg.exe 启动调试器。
  3. 文件 菜单上单击 打开的崩溃转储 (或按 Ctrl+D),然后选择要查看该转储文件。

回到顶端

使用 Windbg.exe 确定异常堆栈
  1. 在 Windbg.exe,打开进程的.dmp 文件。
  2. 请确保您符号路径指向正确的位置。 有关如何执行此操作,请访问下面的 Microsoft Web 站点:

    如何获得符号
    http://www.microsoft.com/whdc/devtools/ddk/default.mspx (http://www.microsoft.com/whdc/devtools/ddk/default.mspx)

  3. 在命令提示符下键入 ~ * kb 以列出所有进程中的线程。
  4. 标识对函数调用的线程 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]
    					
  5. 切换到该线程 (在本例中,该线程是"~120s")。
  6. 在第一个参数的指定位置显示内存内容 Kernel32! UnhandledExceptionFilter 通过 添加 第一个参数 。 此指向 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 
    					
  7. 第一个 DWORD 代表异常记录。 若要获取有关异常的类型信息,请请在命令提示符处运行以下:

    .exr first 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 
    					
  8. 第二个 DWORD 是上下文记录。 若要获取上下文的信息,请在命令提示符处运行以下:

    .cxr second 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] 
    					
  9. 运行 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]
    					

posted on 2009-01-08 15:53 jans2002 阅读(10073) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理