C++ 获取崩溃后收集Core时在堆栈外优化的变量值的替代方法

C++ 获取崩溃后收集Core时在堆栈外优化的变量值的替代方法,c++,c,optimization,gdb,core,C++,C,Optimization,Gdb,Core,有时,由于某些极端情况场景而发生系统崩溃,这是很难重现的。在这种情况下,要进行调试,核心文件分析是唯一的希望。 在核心文件上使用gdb,我无法检查某些变量的值,因为gdb说该值已优化 (gdb) p index $37 = <optimized out> (gdb) info locals index = <optimized out> data_result = <optimized out> level = 18 (gdb)p索引 $37 = (gdb

有时,由于某些极端情况场景而发生系统崩溃,这是很难重现的。在这种情况下,要进行调试,核心文件分析是唯一的希望。 在核心文件上使用gdb,我无法检查某些变量的值,因为gdb说该值已优化

(gdb) p index
$37 = <optimized out>
(gdb) info locals
index = <optimized out>
data_result = <optimized out>
level = 18
(gdb)p索引
$37 = 
(gdb)本地信息
索引=
数据_结果=
级别=18
我知道这是因为stack必须将这些局部变量的值与其他变量进行切换

我知道有几种方法可以重建代码并获得先前优化过的所需值:

1) 将局部变量的值存储在全局变量中,因为全局变量在核心集合中未优化

2) 使用诸如static/volatile之类的关键字,这样就不会对感兴趣的局部变量进行优化

但是,在这两种情况下,问题在于——有些问题没有一致地再现——因此,在GDB中修改代码以获得优化变量的值是行不通的

有时还有另一种方法可以工作——这取决于代码流

1) 如果局部变量是由某个全局变量初始化的,那么在这种情况下,不是打印局部变量的值,而是打印全局变量的值,这样可以得到所需的结果这种方式并不是完全证明,而是依赖于代码流。有时,局部变量是这样初始化的——有时不是这样

任何能让我得到变量值的建议都将不胜感激


谢谢

你可以看到程序集和寄存器——ebp、esp和其他,并推断出变量。我认为没有任何简单的方法。编译器优化该值是有原因的——通常是因为不再需要它。所以很可能你根本无法直接得到它。你需要经历(通常是艰苦的)任务,试图从核心的其他价值观中重建或推断出价值观。这通常需要查看汇编级指令和寄存器值。即使这样,也不能保证核心中有足够的信息。祝你好运