Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果我有一些符号警告,我可以使用windbg分析的结果吗?_C++_Debugging_Windbg_Crash Dumps_Memory Dump - Fatal编程技术网

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

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

我是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

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位程序。