C++ 了解Visual C+中的崩溃转储+;应用程序
更新 多亏了下面的反馈,我才得以熟悉ADPlus.vbs,它是Windows调试工具的一部分 在运行之前,不要忘记设置\u NT\u SYMBOL\u路径 使用它,我们能够更清楚地看到应用程序的细节,比使用Windows在应用程序崩溃时生成的常规转储更清晰 非常感谢大家的回复 原始问题C++ 了解Visual C+中的崩溃转储+;应用程序,c++,crash-dumps,C++,Crash Dumps,更新 多亏了下面的反馈,我才得以熟悉ADPlus.vbs,它是Windows调试工具的一部分 在运行之前,不要忘记设置\u NT\u SYMBOL\u路径 使用它,我们能够更清楚地看到应用程序的细节,比使用Windows在应用程序崩溃时生成的常规转储更清晰 非常感谢大家的回复 原始问题 我们有一个服务器应用程序,在Visual C++中,在客户站点上有几次(相对较少)崩溃。我们无法通过查看自己的日志文件来理解为什么会发生这种情况,因此下一步是开始查看崩溃转储 我们只是故意在我们的应用程序中添加了
我们有一个服务器应用程序,在Visual C++中,在客户站点上有几次(相对较少)崩溃。我们无法通过查看自己的日志文件来理解为什么会发生这种情况,因此下一步是开始查看崩溃转储
我们只是故意在我们的应用程序中添加了一个bug(一个空指针),这样我们就可以生成一个崩溃转储,并验证生成的转储是否有价值,但到目前为止,我无法完全理解我所看到的 我想我的第一个问题是我是否已经正确地设置了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
DbgBreakPoint——在我看来,您使用远程调试器中断了执行
如果您没有这样做,那么当您打开代码页(编辑:我的意思是
页面堆
)并且检测到无效内存访问时,我看到DbgBreakPoint出现。断言也会触发断点异常。例如,当堆被双重删除或溢出损坏时,我(经常)看到它们从堆中出来,围绕着删除进行检查。但我认为只有在调试运行时,您才部署了它?无论好坏,我们的代码中至少没有断言,我们引入的“bug”是一个简单的空指针问题。谢谢你的反馈。肯定不是由远程调试器引起的。我们没有意识到我们打开了代码页,没有,但是如果有空指针引用的话,检测无效内存访问大概不会离目标太远吧?有没有办法让转储文件告诉我们无效内存访问发生在哪里?@Matt Peddlesden-打开代码页,在崩溃模式下使用ADPlus.exe运行它。当发生无效访问时,ADPlus应该生成一个完全转储。老实说,不完全确定您所指的“代码页”是什么-这不是关于字符集吗?例如,1250是欧洲,437是美国?对不起,“页面堆”不是代码页!难怪你感到困惑。基本上,将已知十六进制模式的定界区域添加到分配内存区域的开始和结束。在这里查看这些资源和。ADplus是windows调试工具的一部分,如果您使用的是WinDBG,您应该已经拥有了它。啊哈,好的,是的,我找到了ADplus-我现在就去阅读页面堆,谢谢Dennis!