MENU

在调试GCC时遇到变量已被优化

September 8, 2021 • 阅读: 2357 • 笔记&折腾

在调试GCC时遇到 变量已被优化 的问题。

在编译 GCC 源码时用的 configure 配置为官网推荐的配置:

../gcc-11.1.0/configure --prefix=/usr/compiler/ --target=xxx --with-sysroot=xxx --with-abi=xxx --with-arch=xxx --enable-languages=c,c++

在使用该配置生成的 Makefile 中,编译 GCC 时默认的编译选项为 -O2 -g -g 选项的意思是允许对 GCC 进行调试,-O2 选项的意思为编译优化程度。使用此默认编译选项会导致一个问题:虽然允许对 GCC 进行调试,但是在调试时 GCC 源码的中间变量将会被优化。比如在调试时出现:

(gdb) p beichu
dwarf2_find_location_expression: Corrupted DWARF expression.
(gdb) p chu
$3 = <optimized out>

在调试过程中即时我们能进入 GCC 源码调试,但是几乎所有源码中的中间变量都被优化掉,无法获取其具体的值。

想要在调试 GCC 时获取变量的值,就要修改 configure 的配置:

../gcc-11.1.0/configure --prefix=/usr/compiler/ --target=xxx --with-sysroot=xxx --with-abi=xxx --with-arch=xxx --enable-languages=c,c++ CFLAGS_FOR_TARGET="-g3 -gdwarf-2 -O0" CXXFLAGS_FOR_TARGET="-g3 -gdwarf-2 -O0 " CFLAGS="-g3 -gdwarf-2 -O0" CXXFLAGS="-g3 -gdwarf-2 -O0" 

执行完该命令后修改生成的 Makefile,将 Makefile 中的 -O2 -g 全都改成 -O0 -g ,目的是使在编译 GCC 时采用 -O0 级别的优化。

重新 make && make install 。

如果使用了 newlib 则需要重新编译 newlib。

重新安装后再进行调试:

(gdb) p beichu
$6 = 1234000000000000000
(gdb) p chu
$7 = 300

此时在调试 GCC 源码时已经能打印 GCC 的中间变量。