GDB调试显示< optimized_out >

最近使用GDB调试的时候,经常遇到GDB查看变量值的时候输出< optimized_out >,Google了一下,找到几个解决方法,来应对不通情况下需要查看具体变量输出的场景。

解决方案

将GCC优化选项调整为O1或是O0

GCC在O2O3优化选项下会将代码优化的比较多,调试器有可能会找不到变量的信息。通常可以将优化级别降低到O0,完全关闭优化,可以保留所有的变量和代码信息。使用O1优化有可能也可以看得到变量的值。

当然,这种直接降低优化级别的方法还是比较暴力的。如果你的程序比较大,运行到你需要调试的地方需要很久的情况下,通常都是行不通的,毕竟所有优化选项都关掉了,程序跑的会非常慢……

输出打印信息

直接将变量的信息打印到屏幕上是最直接的方法。当然了,这种方法太糙,太繁琐了。一旦你需要看的变量比较多,输出的内容也会非常多,看起来就比较痛苦了。

volatile修饰需要显示的变量

在需要显示值的变量前面加上volatile修饰符也是一种比较管用的方法。这种方法不需要修改编译器的优化级别,对于比较庞大的程序来说是比较合适的。如果这种方法也不管用或是也不适用的话,请往下看。

volatile修饰符请看这里:https://stackoverflow.com/questions/4437527/why-do-we-use-volatile-keyword-in-c

GCC下关闭某函数的优化选项

在GCC中,我们可以指定将某个函数的优化选项关闭,比如说你可以将some_function的优化级别设定为O0

void some_function() __attribute__ ((optimize(0))) {
  ...
}
这个方法在GCC 4.4版本以上有效

GCC下关闭一段函数的优化

在GCC中我们也可以将某一段代码(不一定是某个函数)的优化等级关掉。比如说。

void foo() {
    func1();
#pragma GCC push_options
#pragma GCC optimize (0)
    func2();
    // do something
    ...
#pragma GCC pop_options
    func3();
}
  • #pragma GCC push_options可以将当前的GCC选项暂存。
  • #pragma GCC optimize (0)可以调整当前GCC的优化选项。0就代表O0优化。也支持字符串:#pragma GCC optimize ("O1")
  • #pragma GCC pop_options将之前暂存的GCC编译选项还原出来。

更多信息可以查看:https://gcc.gnu.org/onlinedocs/gcc-5.1.0/gcc/Function-Specific-Option-Pragmas.html#Function-Specific-Option-Pragmas

GCC 4.4及以上版本有效

Ref

  1. https://stackoverflow.com/questions/9123676/how-do-i-view-the-value-of-an-optimized-out-variable-in-c/9133439
  2. https://stackoverflow.com/questions/5580140/is-there-a-way-to-tell-gcc-not-to-optimise-a-particular-piece-of-code
  3. https://stackoverflow.com/questions/31373885/how-to-change-optimization-level-of-one-function
Last modification:October 24, 2018
If you think my article is useful to you, please feel free to appreciate