C++ 如果我有一些符号警告,我可以使用windbg分析的结果吗?
我是windbg和windows内存分析的新手。 我尝试分析内存转储(崩溃转储),它是x64系统 加载所有符号后(my和microsoft) 我输入C++ 如果我有一些符号警告,我可以使用windbg分析的结果吗?,c++,debugging,windbg,crash-dumps,memory-dump,C++,Debugging,Windbg,Crash Dumps,Memory Dump,我是windbg和windows内存分析的新手。 我尝试分析内存转储(崩溃转储),它是x64系统 加载所有符号后(my和microsoft) 我输入!分析-v 这是输出的一部分: ...... FAULTING_SOURCE_CODE: <some code here> SYMBOL_STACK_INDEX: 6 SYMBOL_NAME: rtplogic!CSRTPStack::Finalize+19d FOLLOWUP_NAME: MachineOwner MOD
!分析-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
......
。。。。。。
错误源代码:
符号\u堆栈\u索引:6
符号名称:rtplogic!CSRTPStack::最终确定+19d
跟进名称:机器所有者
模块名称:RTPLogic
图像名称:RTPLogic.dll
调试\u FLR\u图像\u时间戳:58542837
STACK_命令:~544s。ecxr;kb
失败\u BUCKET\u ID:错误的\u符号\u c0000374\u RTPLogic.dll!CSRTPStack::Finalize
BUCKET\u ID:X64\u应用程序\u故障\u错误\u符号\u rtplogic!CSRTPStack::最终确定+19d
......
这个错误的\u符号
让我担心
我可以确定源代码中的代码是否与崩溃相关吗?不,很遗憾,您不能信任它。在对调用堆栈的分析中,至少有一点调试器不能100%确定堆栈是否正确展开 当您键入
~544s。ecxr;k
您将看到一个调用堆栈。该调用堆栈将在其变得不确定时包含一个警告。您可以信任之前的一切,这可能已经有所帮助,但您不能信任警告下面的堆栈帧
您可以将k
输出与dps@ebp
进行比较(如果不够,可以添加L fff
),以查看调试器还可以猜到什么
请注意,在dps的输出中,如果您在堆栈上的一次计算意外地产生了一个可以解释为符号的值,您可能还会看到完全不相关的内容。否,不幸的是,您不能信任它。在对调用堆栈的分析中,至少有一点调试器不能100%确定堆栈是否正确展开 当您键入
~544s。ecxr;k
您将看到一个调用堆栈。该调用堆栈将在其变得不确定时包含一个警告。您可以信任之前的一切,这可能已经有所帮助,但您不能信任警告下面的堆栈帧
您可以将k
输出与dps@ebp
进行比较(如果不够,可以添加L fff
),以查看调试器还可以猜到什么
请注意,在dps的输出中,如果您在堆栈上的一次计算意外地产生了一个可以解释为符号的值,您可能还会看到完全不相关的内容。
c0000374
是一个状态\u堆\u损坏。查看正常转储仅在发生损坏后显示代码
使用gflags.exe为您的exe激活Pageheap
启用在每个分配边界保留内存的Windows功能,以检测超出分配范围的内存访问尝试。这将使应用程序更快崩溃,在这里您可以看到崩溃的真正原因。打开dmp并运行!分析-v
以查看哪些内容被损坏 c0000374
是一种状态\u堆\u损坏
。查看正常转储仅在发生损坏后显示代码
使用gflags.exe为您的exe激活Pageheap
启用在每个分配边界保留内存的Windows功能,以检测超出分配范围的内存访问尝试。这将使应用程序更快崩溃,在这里您可以看到崩溃的真正原因。打开dmp并运行!分析-v
以查看哪些内容被损坏 听起来很有趣。据我所知,gflags
是一个工具,可以更改已经运行的进程的某些设置。但在我的情况下,内存转储不是从我的电脑,我并没有直接访问远程电脑的问题。是否可以以其他方式启用此功能?l对于编译期间的调试标志之类的示例?您必须在应用程序崩溃的PC上激活此设置。@StepanLoginov:请注意,全页堆将为堆上的每个int
分配8kB内存(2页,1页可访问的数据页和1页不可访问的触发调试器页)。因此,这种方法只能发现大于4kB的泄漏。我发现它对32位程序几乎不起作用,因为它们在实际问题发生之前都遭受内存不足的痛苦。它可能适合您的64位程序。听起来很有趣。据我所知,gflags
是一个工具,可以更改已经运行的进程的某些设置。但在我的情况下,内存转储不是从我的电脑,我并没有直接访问远程电脑的问题。是否可以以其他方式启用此功能?l对于编译期间的调试标志之类的示例?您必须在应用程序崩溃的PC上激活此设置。@StepanLoginov:请注意,全页堆将为堆上的每个int
分配8kB内存(2页,1页可访问的数据页和1页不可访问的触发调试器页)。因此,这种方法只能发现大于4kB的泄漏。我发现它对32位程序几乎不起作用,因为它们在实际问题发生之前都遭受内存不足的痛苦。它可能适用于64位程序。