从Visual C ++应用程序了解崩溃转储

时间:2011-06-15 09:43:49

标签: c++ crash-dumps

更新

感谢下面的反馈,我能够访问ADPlus.vbs,它是Windows调试工具的一部分。

在运行之前不要忘记设置_NT_SYMBOL_PATH。

使用这个,我们已经能够更清楚地看到应用程序,它比我们在应用程序崩溃时使用Windows生成的常规转储更加清晰。

非常感谢所有回复。

原始问题

我们有一个用Visual C ++编写的服务器应用程序,有时(相对很少)在客户站点上崩溃。基于查看我们自己的日志文件,我们无法理解为什么会这样,所以下一步就是开始查看崩溃转储。

我们只是故意将错误放入我们的应用程序(空指针),以便我们可以生成崩溃转储并验证生成的转储是否有价值,但到目前为止我无法做出什么样的头或尾我正在看。

我认为我的第一个问题是我是否已正确设置WinDbg(此处的其他开发人员正在将转储加载到Visual Studio 2010并看到相同的错误,所以我假设它很好,或者我们是两个错误:)) - 然后接下来的问题是,我怎么理解它告诉我的是什么。

主要的困惑是转储似乎告诉我它已达到一个断点,这对我来说似乎很奇怪,因为没有连接调试器。

该应用程序在崩溃时在Windows Server 2003系统上运行。我相信我已经正确地将WinDbg指向DLL和EXE的PDB文件。

FAULTING_IP: 
ntdll!DbgBreakPoint+0
7c81a3e1 cc              int     3

EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 7c81a3e1 (ntdll!DbgBreakPoint)
   ExceptionCode: 80000003 (Break instruction exception)
  ExceptionFlags: 00000000
NumberParameters: 3
   Parameter[0]: 00000000
   Parameter[1]: 8779fdb0
   Parameter[2]: 00000003

DEFAULT_BUCKET_ID:  STATUS_BREAKPOINT

PROCESS_NAME:  CallPlusServerLauncher.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:  00000000

EXCEPTION_PARAMETER2:  8779fdb0

EXCEPTION_PARAMETER3:  00000003

NTGLOBALFLAG:  0

APPLICATION_VERIFIER_FLAGS:  0

ADDITIONAL_DEBUG_TEXT:  Followup set based on attribute [Is_ChosenCrashFollowupThread] from Frame:[0] on thread:[ffffffff]

FAULTING_THREAD:  ffffffff

PRIMARY_PROBLEM_CLASS:  STATUS_BREAKPOINT

BUGCHECK_STR:  APPLICATION_FAULT_STATUS_BREAKPOINT

STACK_TEXT:  
1bd0ffc8 7c83fe08 00000005 00000004 00000001 ntdll!DbgBreakPoint
1bd0fff4 00000000 00000000 00000000 00000000 ntdll!DbgUiRemoteBreakin+0x36


FOLLOWUP_IP: 
ntdll!DbgBreakPoint+0
7c81a3e1 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:  49900d60

STACK_COMMAND:  ddS 1bd10000 1bd0c000 ; dt ntdll!LdrpLastDllInitializer BaseDllName ; dt ntdll!LdrpFailureData ; ~439s; .ecxr ; kb

BUCKET_ID:  MANUAL_BREAKIN

FAILURE_BUCKET_ID:  STATUS_BREAKPOINT_80000003_ntdll.dll!DbgBreakPoint

WATSON_STAGEONE_URL:      http://watson.microsoft.com/StageOne/CallPlusServerLauncher_exe/0_0_0_0/4df87414/ntdll_dll/5_2_3790_4455/49900d60/80000003/0001a3e1.htm?Retriage=1

Followup: MachineOwner

2 个答案:

答案 0 :(得分:1)

DbgBreakPoint - 在我看来,就像你使用远程调试器破坏执行一样。

如果你没有,那么当你有代码页(编辑:我的意思是page heap)打开时我会看到DbgBreakPoint出现(你应该知道你是否这样做了)并且检测到无效的内存访问。

答案 1 :(得分:0)

断言也可以触发断点异常。例如,当堆被双重删除或溢出损坏时,我(经常)看到它们从堆中检出来检查删除。但只有我认为的调试运行时,你所部署的是什么?