C++ 分析崩溃转储文件

C++ 分析崩溃转储文件,c++,visual-studio-2010,windbg,dump,crash-dumps,C++,Visual Studio 2010,Windbg,Dump,Crash Dumps,我有一个客户的崩溃转储文件,我必须对其进行分析。我不熟悉崩溃转储分析的世界。(源代码是C++) 以下是我尝试过的:- 我用MS Visual Studio打开了.dmp文件,其中指出了以下错误-您无法调试32位进程的64位转储。因此,我想尝试一下WinDbg 设置符号搜索路径后在WinDbg中打开文件时,我开始获取以下-调试对象未连接。 有人能给我指出正确的方向吗?我应该要求客户从他的观点提供32位转储,还是可以调试此转储文件 另外,提供入门所需的文档。在某种程度上,您可以使用Windbg调

我有一个客户的崩溃转储文件,我必须对其进行分析。我不熟悉崩溃转储分析的世界。(源代码是C++)

以下是我尝试过的:-

  • 我用MS Visual Studio打开了.dmp文件,其中指出了以下错误-您无法调试32位进程的64位转储。因此,我想尝试一下
    WinDbg

  • 设置符号搜索路径后在WinDbg中打开文件时,我开始获取以下-调试对象未连接。

有人能给我指出正确的方向吗?我应该要求客户从他的观点提供32位转储,还是可以调试此转储文件


另外,提供入门所需的文档。

在某种程度上,您可以使用Windbg调试32位进程的64位转储, 通过使用wow64exts。然而,如果可能的话,我认为最好有一个32位转储。 如果客户可以提供32位转储,请获取它

以下是WOW64EXT的示例:

0:008> k
Child-SP          RetAddr           Call Site
00000000`0291f128 00000000`779d263a wow64cpu!CpupSyscallStub+0x2
00000000`0291f130 00000000`7792c4f6 wow64cpu!WaitForMultipleObjects32+0x1d
00000000`0291f1e0 00000000`7792b8f5 wow64!RunCpuSimulation+0xa
00000000`0291f230 000007fe`e51fd6af wow64!Wow64LdrpInitialize+0x435
00000000`0291f770 000007fe`e519c1ae ntdll!_LdrpInitialize+0xde
00000000`0291f7e0 00000000`00000000 ntdll!LdrInitializeThunk+0xe
0:008> .load wow64exts
0:008> !sw
Switched to 32bit mode
0:008:x86> k
ChildEBP RetAddr  
02a1f2dc 7783c752 ntdll_779e0000!NtWaitForMultipleObjects+0xc
02a1f460 75b956c0 KERNELBASE!WaitForMultipleObjectsEx+0x10b
02a1f4d4 75b9586a kernel32!WerpReportFaultInternal+0x1c4
02a1f4e8 75b67828 kernel32!WerpReportFault+0x6d
02a1f4f4 778c07c4 kernel32!BasepReportFault+0x19

在某种程度上,您可以使用Windbg调试32位进程的64位转储, 通过使用wow64exts。然而,如果可能的话,我认为最好有一个32位转储。 如果客户可以提供32位转储,请获取它

以下是WOW64EXT的示例:

0:008> k
Child-SP          RetAddr           Call Site
00000000`0291f128 00000000`779d263a wow64cpu!CpupSyscallStub+0x2
00000000`0291f130 00000000`7792c4f6 wow64cpu!WaitForMultipleObjects32+0x1d
00000000`0291f1e0 00000000`7792b8f5 wow64!RunCpuSimulation+0xa
00000000`0291f230 000007fe`e51fd6af wow64!Wow64LdrpInitialize+0x435
00000000`0291f770 000007fe`e519c1ae ntdll!_LdrpInitialize+0xde
00000000`0291f7e0 00000000`00000000 ntdll!LdrInitializeThunk+0xe
0:008> .load wow64exts
0:008> !sw
Switched to 32bit mode
0:008:x86> k
ChildEBP RetAddr  
02a1f2dc 7783c752 ntdll_779e0000!NtWaitForMultipleObjects+0xc
02a1f460 75b956c0 KERNELBASE!WaitForMultipleObjectsEx+0x10b
02a1f4d4 75b9586a kernel32!WerpReportFaultInternal+0x1c4
02a1f4e8 75b67828 kernel32!WerpReportFault+0x6d
02a1f4f4 778c07c4 kernel32!BasepReportFault+0x19

崩溃转储分析最有用的工具是将其加载到Windbg(文件->打开崩溃转储),然后使用

!analyze -v

指挥部。这将应用一些启发式方法从实际崩溃站点稍微倒带,以确定崩溃的原因可能在哪里,例如发生空指针取消引用的地方。有一个很好的教程。约翰·罗宾斯(John Robbins)是一个非常好的书签站点,他有很多关于Windbg的优秀文章。

崩溃转储分析最有用的工具是将其加载到Windbg(文件->打开崩溃转储),然后使用

!analyze -v

指挥部。这将应用一些启发式方法从实际崩溃站点稍微倒带,以确定崩溃的原因可能在哪里,例如发生空指针取消引用的地方。有一个很好的教程。约翰·罗宾斯(John Robbins)是一个很好的书签站点,它有很多关于Windbg的优秀文章。

你不会主动“运行”dmp文件。你分析它。虽然VS很漂亮,但如果你花时间学习,WinDbg有一些非常惊人的动作可供你使用(并且可以忍受它们持续糟糕的ui)。此外,如果需要,您可以切换64位WinDbg中的有效机器体系结构以分析32位转储(尽管听起来好像不是)。您能为我提供一些解决我提到的错误的方法吗?您能准确描述您在WinDbg中发出的命令吗?您不会主动“运行”dmp文件。你分析它。虽然VS很漂亮,但如果你花时间学习,WinDbg有一些非常惊人的动作可供你使用(并且可以忍受它们持续糟糕的ui)。此外,如果需要,您可以在64位WinDbg中切换有效的机器体系结构以分析32位转储(尽管听起来好像不是)。您能为我提供一些解决我提到的错误的方法吗?您能准确描述您在WinDbg中发出的命令吗?-1 WinDbg当然是一个强大的工具,而且链接非常好。然而,这个答案并没有解决这个问题所涉及的比特问题。我认为问题在于OP是如何使用Windbg的。如果我运行转储文件,会出现类似的错误,但如果我分析它,则不会出现类似的错误,这就是我给出的说明。由于OP没有给出更多细节,我们不知道问题是由于工具使用不当还是Bitness造成的。我没有考虑到这一点,所以可能否决投票太快了。我会撤销它,但我不能,除非答案被编辑。-1 WinDBG当然是一个强大的工具,链接都很好。然而,这个答案并没有解决这个问题所涉及的比特问题。我认为问题在于OP是如何使用Windbg的。如果我运行转储文件,会出现类似的错误,但如果我分析它,则不会出现类似的错误,这就是我给出的说明。由于OP没有给出更多细节,我们不知道问题是由于工具使用不当还是Bitness造成的。我没有考虑到这一点,所以可能否决投票太快了。我想撤销它,但我不能,除非答案被编辑。