我是windbg的新手,在Windows中记忆分析。 我尝试分析内存转储(崩溃转储)它的x64系统。
加载所有符号后(我和微软)
我输入!analyze -v
这是输出的一部分:
......
FAULTING_SOURCE_CODE: <some code here>
SYMBOL_STACK_INDEX: 6
SYMBOL_NAME: rtplogic!CSRTPStack::Finalize+19d
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: RTPLogic
IMAGE_NAME: RTPLogic.dll
DEBUG_FLR_IMAGE_TIMESTAMP: 58542837
STACK_COMMAND: ~544s; .ecxr ; kb
FAILURE_BUCKET_ID: WRONG_SYMBOLS_c0000374_RTPLogic.dll!CSRTPStack::Finalize
BUCKET_ID: X64_APPLICATION_FAULT_WRONG_SYMBOLS_rtplogic!CSRTPStack::Finalize+19d
......
这WRONG_SYMBOLS
让我很担心。
我可以确定FAULTING_SOURCE_CODE
中的代码是与崩溃相关的代码吗?
答案 0 :(得分:2)
不,不幸的是你无法相信它。在调用堆栈的分析中至少有一点,调试器没有100%确定是否让堆栈正确展开。
当您输入~544s; .ecxr; k
时,您会看到一个调用堆栈。该调用堆栈将包含一个警告,此时它变得不确定。您之前可以信任一切,这可能已经有所帮助,但您不能信任警告下方的堆栈帧。
您可以将k
输出与dps @ebp
进行比较(如果还不够,可以添加L fff
),以便了解调试器可能猜到的其他内容。
请注意,在dps
的输出中,您可能还会看到完全不相关的内容,如果不小心,您在堆栈上的某个计算产生的值可能会被解释为符号。
答案 1 :(得分:2)
c0000374
是STATUS_HEAP_CORRUPTION
。查看正常转储仅显示损坏发生后的代码。
使用gflags.exe为您的exe
激活Pageheap
PageHeap启用在每个分配边界保留内存的Windows功能,以检测在分配之外访问内存的尝试。这将使应用程序更快崩溃,在这里您可以看到崩溃的真正原因。打开dmp并运行!analyze -v
以查看损坏的内容。