如果我有一些符号警告,我可以使用windbg分析的结果吗?

时间:2017-01-26 11:30:55

标签: c++ debugging windbg crash-dumps memory-dump

我是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中的代码是与崩溃相关的代码吗?

2 个答案:

答案 0 :(得分:2)

不,不幸的是你无法相信它。在调用堆栈的分析中至少有一点,调试器没有100%确定是否让堆栈正确展开。

当您输入~544s; .ecxr; k时,您会看到一个调用堆栈。该调用堆栈将包含一个警告,此时它变得不确定。您之前可以信任一切,这可能已经有所帮助,但您不能信任警告下方的堆栈帧。

您可以将k输出与dps @ebp进行比较(如果还不够,可以添加L fff),以便了解调试器可能猜到的其他内容。

请注意,在dps的输出中,您可能还会看到完全不相关的内容,如果不小心,您在堆栈上的某个计算产生的值可能会被解释为符号。

答案 1 :(得分:2)

c0000374STATUS_HEAP_CORRUPTION。查看正常转储仅显示损坏发生后的代码。

使用gflags.exe为您的exe

激活Pageheap

enter image description here

PageHeap启用在每个分配边界保留内存的Windows功能,以检测在分配之外访问内存的尝试。这将使应用程序更快崩溃,在这里您可以看到崩溃的真正原因。打开dmp并运行!analyze -v以查看损坏的内容。