2012-08-08 153 views
4

我很难从使用ProcDump创建的崩溃转储中获取任何有意义的信息,但我确定它与我一直看到的随机崩溃有关。Windbg崩溃转储分析

我有一个在Windows 7 64位上运行的VB6应用程序。每过一段时间,它就会崩溃,在错误日志中留下一个条目,该条目与ntdll.dll错误,但没有提供更多信息。所以,我一直在运行SysInternals的ProcDump进程来为我自动创建崩溃转储。

我一直无法重新创建内部的崩溃,所以我很确定,如果我有一个转储,它会告诉我什么是问题。然而,在大部分时间运行之后,我发现ProcDump已经写了几个转储文件,尽管程序仍然运行良好。它似乎指向ntdll.dll的问题,但我不知道从哪里开始为此应用修复程序。

在垃圾场的一个运行!analyze -v给了我下面的:

******************************************************************************* 
*                    * 
*      Exception Analysis         * 
*                    * 
******************************************************************************* 


FAULTING_IP: 
+0 
00000000 ??    ??? 

EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) 
ExceptionAddress: 00000000 
    ExceptionCode: 80000003 (Break instruction exception) 
    ExceptionFlags: 00000000 
NumberParameters: 0 

FAULTING_THREAD: 000007c8 

PROCESS_NAME: application.exe 

ERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION} Breakpoint A breakpoint has been reached. 

EXCEPTION_CODE: (HRESULT) 0x80000003 (2147483651) - One or more arguments are invalid 

NTGLOBALFLAG: 0 

APPLICATION_VERIFIER_FLAGS: 0 

APP: application.exe 

BUGCHECK_STR: APPLICATION_FAULT_STATUS_BREAKPOINT_AFTER_CALL 

PRIMARY_PROBLEM_CLASS: STATUS_BREAKPOINT_AFTER_CALL 

DEFAULT_BUCKET_ID: STATUS_BREAKPOINT_AFTER_CALL 

LAST_CONTROL_TRANSFER: from 7754431f to 7752014d 

STACK_TEXT: 
0382fdf4 7754431f 00000005 035e62c8 00000001 ntdll!ZwWaitForMultipleObjects+0x15 
0382ff88 74cd339a 00000000 0382ffd4 77539ed2 ntdll!TppWaiterpThread+0x33d 
0382ff94 77539ed2 035e6298 74e2a30c 00000000 kernel32!BaseThreadInitThunk+0xe 
0382ffd4 77539ea5 775441f3 035e6298 00000000 ntdll!__RtlUserThreadStart+0x70 
0382ffec 00000000 775441f3 035e6298 00000000 ntdll!_RtlUserThreadStart+0x1b 


STACK_COMMAND: ~0s; .ecxr ; kb 

FOLLOWUP_IP: 
ntdll!ZwWaitForMultipleObjects+15 
7752014d 83c404   add  esp,4 

SYMBOL_STACK_INDEX: 0 

SYMBOL_NAME: ntdll!ZwWaitForMultipleObjects+15 

FOLLOWUP_NAME: MachineOwner 

MODULE_NAME: ntdll 

IMAGE_NAME: ntdll.dll 

DEBUG_FLR_IMAGE_TIMESTAMP: 4ce7ba58 

FAILURE_BUCKET_ID: STATUS_BREAKPOINT_AFTER_CALL_80000003_ntdll.dll!ZwWaitForMultipleObjects 

BUCKET_ID: APPLICATION_FAULT_STATUS_BREAKPOINT_AFTER_CALL_ntdll!ZwWaitForMultipleObjects+15 

WATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/BlackJack_exe/1_5_0_0/50227d4e/unknown/0_0_0_0/bbbbbbb4/80000003/00000000.htm?Retriage=1 

Followup: MachineOwner 

任何人都可以点我在正确的方向,使这个项目的意义上来说,和我能做些什么呢?

+1

在procdump运行时调试此应用程序的位置? 'APPLICATION_FAULT_STATUS_BREAKPOINT_AFTER_CALL'似乎表明一个调试器打入了进程,这是procdump捕获的转储。所以这些转储不会帮助你,因为它们不是实际问题的快照。'ProcDump'是一个非常轻量级的工具,您应该尝试在发生实际问题的地方运行它,然后尝试分析这些转储。 – jcopenha 2012-08-08 20:46:17

+0

我当时没有调试过。我只是在生产计算机上就地安装了ProcDump,在启动时脚本运行(C:\ apps \ procdump.exe -accepteula -e -h -n 10 -t -w application.exe C:\ application.dmp) 。所以基本上,我将ProcDump与我们编译的可执行文件一起运行,随时捕捉转储。所以你说的是这些转储基本上是由ProcDump引起的,所以我不需要担心它们?我试图捕捉的错误绝对是在程序终止时结束的,所以如果它发生在字段中,那就是我试图获得的转储。 – 2012-08-08 20:55:37

+0

我并不是说你不必担心他们。只是!分析-v的报告让我觉得这些并不是真正的崩溃,而是调试器的中断。我会检查各个线程的调用堆栈,看看是否有其他异常。 – jcopenha 2012-08-08 21:01:30

回答

6

为了确保,我已经在我身边执行了一些测试,附加到健康流程并制作刚开始流程的转储。 在所有的情况下,输出!analyze -v与你的非常相似,除了我的一个更详细的事实,我认为它取决于调试器版本。

例如,这里是连接到刚开始画图后,我已经得到的输出:

******************************************************************************* 
*                    * 
*      Exception Analysis         * 
*                    * 
******************************************************************************* 

GetPageUrlData failed, server returned HTTP status 404 
URL requested:  http://watson.microsoft.com/StageOne/mspaint_exe/6_1_7600_16385/4a5bca29/ntdll_dll/6_1_7601_17725/4ec4aa8e/80000003/00050530.htm?Retriage=1 

FAULTING_IP: 
ntdll!DbgBreakPoint+0 
00000000`76d90530 cc    int  3 

EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) 
ExceptionAddress: 0000000076d90530 (ntdll!DbgBreakPoint) 
ExceptionCode: 80000003 (Break instruction exception) 
ExceptionFlags: 00000000 
NumberParameters: 1 
Parameter[0]: 0000000000000000 

FAULTING_THREAD: 0000000000000cbc 

DEFAULT_BUCKET_ID: STATUS_BREAKPOINT 

PROCESS_NAME: mspaint.exe 

ERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION} Breakpoint A breakpoint has been reached. 

EXCEPTION_CODE: (HRESULT) 0x80000003 (2147483651) - One or more arguments are invalid 

EXCEPTION_PARAMETER1: 0000000000000000 

MOD_LIST: <ANALYSIS/> 

NTGLOBALFLAG: 0 

APPLICATION_VERIFIER_FLAGS: 0 

PRIMARY_PROBLEM_CLASS: STATUS_BREAKPOINT 

BUGCHECK_STR: APPLICATION_FAULT_STATUS_BREAKPOINT 

LAST_CONTROL_TRANSFER: from 0000000076e37ef8 to 0000000076d90530 

STACK_TEXT: 


FOLLOWUP_IP: 
ntdll!DbgBreakPoint+0 
00000000`76d90530 cc    int  3 

SYMBOL_STACK_INDEX: 0 

SYMBOL_NAME: ntdll!DbgBreakPoint+0 

FOLLOWUP_NAME: MachineOwner 

MODULE_NAME: ntdll 

IMAGE_NAME: ntdll.dll 

DEBUG_FLR_IMAGE_TIMESTAMP: 4ec4aa8e 

STACK_COMMAND: ~8s ; kb 

FAILURE_BUCKET_ID: STATUS_BREAKPOINT_80000003_ntdll.dll!DbgBreakPoint 

BUCKET_ID: X64_APPLICATION_FAULT_STATUS_BREAKPOINT_ntdll!DbgBreakPoint+0 

WATSON_STAGEONE_URL:  http://watson.microsoft.com/StageOne/mspaint_exe/6_1_7600_16385/4a5bca29/ntdll_dll/6_1_7601_17725/4ec4aa8e/80000003/00050530.htm?Retriage=1 

Followup: MachineOwner 
--------- 

我也是在这里ProcDump标志的解释采取一看:http://technet.microsoft.com/en-us/sysinternals/dd996900.aspx。它看起来像使用命令行一样

C:\apps\procdump.exe -accepteula -e -h -n 10 -t -w application.exe 

你让procdump停止悬挂或异常的所有迹象都没有设置具体的参数,如内存使用数量或CPU使用率procent。

我会建议使用DebugDiag,它提供了很好的用户界面,您可以在其中配置规则来描述何时应该创建转储。 下面是我的解释,如何收集转储,当你有过多的内存使用量的问题,或高CPU使用率:

http://kate-butenko.blogspot.com/2012/06/how-to-gather-dump-with-debugdiag.html

,这里是另一种微细的截屏解释,如何获取转储在DebugDiag资料为特定的异常:

http://blogs.msdn.com/b/kaushal/archive/2012/05/09/using-debugdiag-to-capture-a-dump-on-first-chance-exception.aspx

从一套更ligthweight工具,你也可以检查ADPlus工具(位于C:\ Program Files文件\ Windows调试工具(x64)的˚F以上)。我更喜欢DebugDiag,因为它允许捕获特定类型的异常。

+0

谢谢你的彻底答案! – 2012-08-10 15:44:46