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

Posted

技术标签:

【中文标题】如果我有一些符号警告,我可以使用 windbg 分析的结果吗?【英文标题】:Can I use result of windbg analyse if I have some symbol warnings? 【发布时间】:2017-06-11 20:49:59 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

听起来很有趣。据我了解gflags 是更改已运行进程的某些设置的工具。但在我的情况下,内存转储不是来自我的 PC,而且我没有直接访问有问题的远程 PC。是否可以通过其他方式启用此功能? L例如编译时的调试标志? 您必须在应用崩溃的 PC 上激活此设置。 @StepanLoginov:请注意,整页堆将为堆上的每个 int 分配 8kB 的内存(2 页,1 个用于数据的可访问页和 1 个用于触发调试器的不可访问页) .因此,这种方法只能发现 >4kB 的泄漏。我发现它几乎不适用于 32 位程序,因为它们在实际问题发生之前都会遭受内存不足的困扰。它可能适用于您的 64 位程序。

以上是关于如果我有一些符号警告,我可以使用 windbg 分析的结果吗?的主要内容,如果未能解决你的问题,请参考以下文章

如果使用WINDBG来调试C语言程序.

安装与配置windbg的symbol(符号)

windbg 和cdbg使用总结

WinDbg 在 msdl.microsoft.com 上找不到 mfc90 版本 9.0.30729.4148 符号

在 windbg 中,啥会导致消息“警告:无法验证 mydll.dll 的时间戳”?

如何设置windbg自动下载所有符号?