【问题标题】:Understand Crash Dump from Visual C++ App从 Visual C++ 应用程序了解故障转储
【发布时间】:2011-06-15 09:43:48
【问题描述】:

更新

感谢下面的反馈,我能够熟悉 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

【问题讨论】:

    标签: c++ crash-dumps


    【解决方案1】:

    DbgBreakPoint -- 在我看来,您使用远程调试器中断了执行。

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

    【讨论】:

    • 肯定不是由远程调试器引起的。我们不知道我们打开了代码页,不,但是在进行空指针引用的情况下,检测到无效的内存访问可能不会太离谱?有没有办法让转储给我们提供无效内存访问发生的线索?
    • @Matt Peddlesden - 打开代码页并在崩溃模式下使用 ADPlus.exe 运行它。然后,当发生无效访问时,ADPlus 应生成完整转储。
    • 老实说,不完全确定您所指的“代码页”是什么 - 这不是关于字符集吗?例如。 1250是欧洲,437是美国?
    • 抱歉“页堆”不是代码页!难怪你会感到困惑。基本上将已知十六进制模式的定界区域添加到分配的内存区域的开始和结束。在这里查看这些资源support.microsoft.com/kb/286470msdn.microsoft.com/en-us/library/ff549561%28v=vs.85%29.aspx。 ADplus 是 Windows 调试工具的一部分,鉴于您使用的是 WinDBG,您应该已经拥有它。
    • 啊哈,是的,我找到了 adplus - 我现在就去阅读页面堆,谢谢丹尼斯!
    【解决方案2】:

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

    【讨论】:

    • 不管好坏,我们的代码中至少没有assert,我们引入的“bug”是一个简单的空指针问题。感谢您的反馈。
    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2012-08-28
    • 2015-06-16
    • 1970-01-01
    • 2013-04-17
    • 2014-03-01
    相关资源
    最近更新 更多