在调试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 的中间变量。