【发布时间】:2022-01-07 01:54:06
【问题描述】:
我想要帮助我如何有效地创建并分析一个正在经历随机崩溃的 c++ 应用程序的转储文件。如何在应用程序自动崩溃时创建转储文件?我尝试按照 Windows 提供的本教程进行操作: https://docs.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps
但我不确定这是否适用于我的情况。 此外,使用 winbdbg,我尝试打开一个由任务管理器简单创建的转储文件,以防应用程序使用的内存超出预期。结果:
For analysis of this file, run !analyze -v
wow64cpu!CpupSyscallStub+0xc:
00000000`77291cbc c3 ret
0:000> !analyze -v
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************
*** WARNING: Unable to verify checksum for RFPrj.exe
KEY_VALUES_STRING: 1
Key : Analysis.CPU.Sec
Value: 1
Key : Analysis.DebugAnalysisProvider.CPP
Value: Create: 8007007e on RTX2LBSAPW1V
Key : Analysis.DebugData
Value: CreateObject
Key : Analysis.DebugModel
Value: CreateObject
Key : Analysis.Elapsed.Sec
Value: 105
Key : Analysis.Memory.CommitPeak.Mb
Value: 72
Key : Analysis.System
Value: CreateObject
Key : Timeline.OS.Boot.DeltaSec
Value: 2236962
Key : Timeline.Process.Start.DeltaSec
Value: 27699
NTGLOBALFLAG: 2000100
APPLICATION_VERIFIER_FLAGS: 80001005
APPLICATION_VERIFIER_LOADED: 1
EXCEPTION_RECORD: (.exr -1)
ExceptionAddress: 0000000000000000
ExceptionCode: 80000003 (Break instruction exception)
ExceptionFlags: 00000000
NumberParameters: 0
FAULTING_THREAD: 00007ac8
PROCESS_NAME: RFPrj.exe
ERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION} Breakpoint A breakpoint has been reached.
EXCEPTION_CODE_STR: 80000003
STACK_TEXT:
00000000`00ffe848 00000000`77291b99 : 00000023`77311cec 00000000`012f0023 00000000`00000000 00000000`012f6e6c : wow64cpu!CpupSyscallStub+0xc
00000000`00ffe850 00000000`77291199 : 00000000`012ff688 00007ffc`7d00d0c4 00000000`00ffe920 00007ffc`7d00c5e7 : wow64cpu!Thunk2ArgNSpNSpReloadState+0xc
00000000`00ffe900 00007ffc`7d00cfda : 00000000`0106d000 00000000`00820110 00000000`00000000 00000000`00fff180 : wow64cpu!BTCpuSimulate+0x9
00000000`00ffe940 00007ffc`7d00cea0 : 00000000`00000000 00000000`02c2eed8 00000000`00000000 00000000`00000000 : wow64!RunCpuSimulation+0xa
00000000`00ffe970 00007ffc`7f48538d : 00000000`00000010 00000000`00000010 00007ffc`7f4dd120 00000000`0106c000 : wow64!Wow64LdrpInitialize+0x120
00000000`00ffec20 00007ffc`7f47383f : 00000000`00000001 00000000`00000000 00000000`00000000 00000000`00000001 : ntdll!LdrpInitializeProcess+0x1789
00000000`00fff060 00007ffc`7f427cb3 : 00000000`00000000 00007ffc`7f3b0000 00000000`00000000 00000000`0106e000 : ntdll!_LdrpInitialize+0x4bb73
00000000`00fff100 00007ffc`7f427c5e : 00000000`00fff180 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!LdrpInitialize+0x3b
00000000`00fff130 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!LdrInitializeThunk+0xe
SYMBOL_NAME: wow64cpu!CpupSyscallStub+c
MODULE_NAME: wow64cpu
IMAGE_NAME: wow64cpu.dll
STACK_COMMAND: dt ntdll!LdrpLastDllInitializer BaseDllName ; dt ntdll!LdrpFailureData ; ~0s; .ecxr ; kb
FAILURE_BUCKET_ID: BREAKPOINT_AVRF_80000003_wow64cpu.dll!CpupSyscallStub
OS_VERSION: 10.0.17763.1
BUILDLAB_STR: rs5_release
OSPLATFORM_TYPE: x64
OSNAME: Windows 10
FAILURE_ID_HASH: {19b8a07b-d2f7-3179-d96e-5eb594405f99}
Followup: MachineOwner
无法从中获得任何有用的数据。不确定我的问题是否是我如何创建转储,即,这是否仅在我在崩溃时获得转储时才有效。 有没有很好的演练或教程?
我有以下工具可用:windbg、vs2019。
【问题讨论】:
-
在大多数情况下,您应该使用
procdump来捕获完整的内存崩溃转储,docs.microsoft.com/en-us/sysinternals/downloads/procdump 并且对于像您这样的 32 位进程,永远不要捕获 64 位转储,因为这样分析起来会很麻烦。 -
您的 32 位进程在 wow 或 windows 下运行 windows 虚拟层使用 x86 windbg .dump /ma foo.dmp 捕获转储并使用 x86 windbg 进行分析(有不止一种可用的 windbg在 x86 x64 arm 之类的安装路径中,转到 x86 文件夹和 rin x86 windbg)
-
我没有在生产系统中安装 procdump。我还能做些什么来捕获转储吗?
-
使用
syswow64目录的32位taskmgr.exe。 -
虽然副本最初是用 .NET 编写的,但我相信它会回答您的问题并指出必要的工具。
标签: c++ memory-leaks heap-memory windbg dump