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

Can I use result of windbg analyse if I have some symbol warnings?

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

不,很遗憾,您不能相信它。在对调用堆栈的分析中,至少有一处调试器不能 100% 确定他是否正确展开堆栈。

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

您可以将 k 输出与 dps @ebp 进行比较(如果不够,可以添加 L fff)以查看调试器还可以猜到什么。

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

c0000374 是一个 STATUS_HEAP_CORRUPTION。查看正常转储仅显示损坏发生后的代码。

使用 gflags.exe 为您的 exe 激活 Pageheap

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