如果我有一些符号警告,我可以使用 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】:c0000374
是 STATUS_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 在 msdl.microsoft.com 上找不到 mfc90 版本 9.0.30729.4148 符号