如何用gdb调试gcc的各个执行过程(支持调试lto)

如何调试gcc的lto,这是一个chatgpt和Bing都不知道答案的问题,经过我几天的尝试终于成功了,步骤如下。

首先要更改gcc源码 configure生成的makefile里的所有的-O2为-O0,重新make && make install。

用gcc编译目标文件时加入–verbose和-save-temps选项,
gcc -O3 -flto -save-temps test.c --verbose &>gdbfile
生成的gdbfile文件如下

使用内建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/lto-wrapper
目标:x86_64-linux-gnu
配置为:../gcc-openEuler/configure --prefix=/home/gps/GCC/gcc-euler-bin --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,fortran,lto --enable-plugin --enable-initfini-array --disable-libgcj --without-isl --without-cloog --enable-gnu-indirect-function --build=x86_64-linux-gnu --with-stage1-ldflags=' -Wl,-z,relro,-z,now' --with-boot-ldflags=' -Wl,-z,relro,-z,now' --disable-bootstrap --with-tune=generic --with-arch_32=x86-64 --disable-multilib
线程模型:posix
Supported LTO compression algorithms: zlib zstd
gcc 版本 10.3.1 (GCC) 
COLLECT_GCC_OPTIONS='-O3' '-flto' '-save-temps' '-v' '-mtune=generic' '-march=x86-64'
 /home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/cc1 -E -quiet -v test.c -mtune=generic -march=x86-64 -flto -O3 -fpch-preprocess -o test.i
忽略不存在的目录“/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../../../x86_64-linux-gnu/include”
#include "..." 搜索从这里开始:
#include <...> 搜索从这里开始:
 /home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/include
 /usr/local/include
 /home/gps/GCC/gcc-euler-bin/include
 /home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/include-fixed
 /usr/include
搜索列表结束。
COLLECT_GCC_OPTIONS='-O3' '-flto' '-save-temps' '-v' '-mtune=generic' '-march=x86-64'
 /home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/cc1 -fpreprocessed test.i -quiet -dumpbase test.c -mtune=generic -march=x86-64 -auxbase test -O3 -version -flto -o test.s
GNU C17 (GCC) 版本 10.3.1 (x86_64-linux-gnu)
	由 GNU C 版本 8.5.0 20210514 (Red Hat 8.5.0-4) 编译,GMP 版本 6.1.0,MPFR 版本 3.1.4,MPC 版本 1.0.3,isl 版本 none
GGC 准则:--param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU C17 (GCC) 版本 10.3.1 (x86_64-linux-gnu)
	由 GNU C 版本 8.5.0 20210514 (Red Hat 8.5.0-4) 编译,GMP 版本 6.1.0,MPFR 版本 3.1.4,MPC 版本 1.0.3,isl 版本 none
GGC 准则:--param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 79fa3e3c5e1983eabab77e8587cd7e4c
COLLECT_GCC_OPTIONS='-O3' '-flto' '-save-temps' '-v' '-mtune=generic' '-march=x86-64'
 as -v --64 -o test.o test.s
GNU assembler version 2.30 (x86_64-redhat-linux) using BFD version version 2.30-108.el8_5.1
COMPILER_PATH=/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-O3' '-flto' '-save-temps' '-v' '-mtune=generic' '-march=x86-64'
 /home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/collect2 -plugin /home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/liblto_plugin.so -plugin-opt=/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/lto-wrapper -plugin-opt=-fresolution=test.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -flto --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 /lib/../lib64/crt1.o /lib/../lib64/crti.o /home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/crtbegin.o -L/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1 -L/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../.. test.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/crtend.o /lib/../lib64/crtn.o
/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/lto-wrapper -fresolution=test.res -flinker-output=exec test.o 
/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/lto-wrapper -fresolution=test.res -flinker-output=exec test.o 
gcc @/tmp/ccQRrSV4
使用内建 specs。
COLLECT_GCC=gcc
目标:x86_64-linux-gnu
配置为:../gcc-openEuler/configure --prefix=/home/gps/GCC/gcc-euler-bin --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,fortran,lto --enable-plugin --enable-initfini-array --disable-libgcj --without-isl --without-cloog --enable-gnu-indirect-function --build=x86_64-linux-gnu --with-stage1-ldflags=' -Wl,-z,relro,-z,now' --with-boot-ldflags=' -Wl,-z,relro,-z,now' --disable-bootstrap --with-tune=generic --with-arch_32=x86-64 --disable-multilib
线程模型:posix
Supported LTO compression algorithms: zlib zstd
gcc 版本 10.3.1 (GCC) 
COLLECT_GCC_OPTIONS='-c' '-fno-openmp' '-fno-openacc' '-fno-pie' '-fcf-protection=none' '-O3' '-O3' '-save-temps' '-v' '-mtune=generic' '-march=x86-64' '-fltrans-output-list=/tmp/ccufLak6.ltrans.out' '-fwpa' '-fresolution=test.res' '-flinker-output=exec'
 /home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/lto1 -quiet -dumpbase test.o -mtune=generic -march=x86-64 -auxbase test -O3 -O3 -version -fno-openmp -fno-openacc -fno-pie -fcf-protection=none -fltrans-output-list=/tmp/ccufLak6.ltrans.out -fwpa -fresolution=test.res -flinker-output=exec @/tmp/cc71VFD8
GNU GIMPLE (GCC) 版本 10.3.1 (x86_64-linux-gnu)
	由 GNU C 版本 8.5.0 20210514 (Red Hat 8.5.0-4) 编译,GMP 版本 6.1.0,MPFR 版本 3.1.4,MPC 版本 1.0.3,isl 版本 none
GGC 准则:--param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU GIMPLE (GCC) 版本 10.3.1 (x86_64-linux-gnu)
	由 GNU C 版本 8.5.0 20210514 (Red Hat 8.5.0-4) 编译,GMP 版本 6.1.0,MPFR 版本 3.1.4,MPC 版本 1.0.3,isl 版本 none
GGC 准则:--param ggc-min-expand=100 --param ggc-min-heapsize=131072
COMPILER_PATH=/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/:/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../../../lib64/../lib64/:/lib/../lib64/../lib64/:/usr/lib/../lib64/../lib64/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../../:/lib/:/usr/lib/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-c' '-fno-openmp' '-fno-openacc' '-fno-pie' '-fcf-protection=none' '-O3' '-O3' '-save-temps' '-v' '-mtune=generic' '-march=x86-64' '-fltrans-output-list=/tmp/ccufLak6.ltrans.out' '-fwpa' '-fresolution=test.res' '-flinker-output=exec'
[Leaving LTRANS /tmp/ccufLak6.ltrans.out]
gcc @/tmp/ccZB7DW3
使用内建 specs。
COLLECT_GCC=gcc
目标:x86_64-linux-gnu
配置为:../gcc-openEuler/configure --prefix=/home/gps/GCC/gcc-euler-bin --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,fortran,lto --enable-plugin --enable-initfini-array --disable-libgcj --without-isl --without-cloog --enable-gnu-indirect-function --build=x86_64-linux-gnu --with-stage1-ldflags=' -Wl,-z,relro,-z,now' --with-boot-ldflags=' -Wl,-z,relro,-z,now' --disable-bootstrap --with-tune=generic --with-arch_32=x86-64 --disable-multilib
线程模型:posix
Supported LTO compression algorithms: zlib zstd
gcc 版本 10.3.1 (GCC) 
COLLECT_GCC_OPTIONS='-c' '-fno-openmp' '-fno-openacc' '-fno-pie' '-fcf-protection=none' '-O3' '-O3' '-save-temps' '-v' '-mtune=generic' '-march=x86-64' '-fltrans-output-list=/tmp/ccufLak6.ltrans.out' '-fltrans' '-o' '/tmp/ccufLak6.ltrans0.ltrans.o'
 /home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/lto1 -quiet -dumpbase ccufLak6.ltrans0.o -mtune=generic -march=x86-64 -auxbase-strip /tmp/ccufLak6.ltrans0.ltrans.o -O3 -O3 -version -fno-openmp -fno-openacc -fno-pie -fcf-protection=none -fltrans-output-list=/tmp/ccufLak6.ltrans.out -fltrans @/tmp/ccK04Ekk -o ccufLak6.ltrans0.s
GNU GIMPLE (GCC) 版本 10.3.1 (x86_64-linux-gnu)
	由 GNU C 版本 8.5.0 20210514 (Red Hat 8.5.0-4) 编译,GMP 版本 6.1.0,MPFR 版本 3.1.4,MPC 版本 1.0.3,isl 版本 none
GGC 准则:--param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU GIMPLE (GCC) 版本 10.3.1 (x86_64-linux-gnu)
	由 GNU C 版本 8.5.0 20210514 (Red Hat 8.5.0-4) 编译,GMP 版本 6.1.0,MPFR 版本 3.1.4,MPC 版本 1.0.3,isl 版本 none
GGC 准则:--param ggc-min-expand=100 --param ggc-min-heapsize=131072
COLLECT_GCC_OPTIONS='-c' '-fno-openmp' '-fno-openacc' '-fno-pie' '-fcf-protection=none' '-O3' '-O3' '-save-temps' '-v' '-mtune=generic' '-march=x86-64' '-fltrans-output-list=/tmp/ccufLak6.ltrans.out' '-fltrans' '-o' '/tmp/ccufLak6.ltrans0.ltrans.o'
 as -v --64 -o /tmp/ccufLak6.ltrans0.ltrans.o ccufLak6.ltrans0.s
GNU assembler version 2.30 (x86_64-redhat-linux) using BFD version version 2.30-108.el8_5.1
COMPILER_PATH=/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/:/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../../../lib64/../lib64/:/lib/../lib64/../lib64/:/usr/lib/../lib64/../lib64/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../../:/lib/:/usr/lib/:/home/gps/GCC/gcc-euler-bin/lib/gcc/x86_64-linux-gnu/10.3.1/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-c' '-fno-openmp' '-fno-openacc' '-fno-pie' '-fcf-protection=none' '-O3' '-O3' '-save-temps' '-v' '-mtune=generic' '-march=x86-64' '-fltrans-output-list=/tmp/ccufLak6.ltrans.out' '-fltrans' '-o' '/tmp/ccufLak6.ltrans0.ltrans.o'
[Leaving LTRANS /tmp/ccufLak6.ltrans0.o]
[Leaving a.out.lto_wrapper_args]
[Leaving /tmp/ccufLak6.ltrans0.ltrans.o]
COLLECT_GCC_OPTIONS='-O3' '-flto' '-save-temps' '-v' '-mtune=generic' '-march=x86-64'

–verbose选项输出的这个文件记录了gcc编译的整个过程。
-save-temps则保留编译过程中生成的临时文件以备调试时使用。其中主要的临时文件生成在当前目录。

[gps@localhost test2]$ ls
a.out                   ccufLak6.ltrans0.s  test.c  test.o    test.s
a.out.lto_wrapper_args  gdbfile             test.i  test.res

大部分cc开头的临时文件则在/tmp(绝对路径)文件夹下。

如果我们要调试预处理后的编译过程,那我们在gdbfile中找到cc1将.i文件编译成.s文件的那一行,
/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/cc1 -fpreprocessed test.i -quiet -dumpbase test.c -mtune=generic -march=x86-64 -auxbase test -O3 -version -flto -o test.s

如果要调试lto过程,则找到lto1
/home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/lto1 -quiet -dumpbase ccufLak6.ltrans0.o -mtune=generic -march=x86-64 -auxbase-strip /tmp/ccufLak6.ltrans0.ltrans.o -O3 -O3 -version -fno-openmp -fno-openacc -fno-pie -fcf-protection=none -fltrans-output-list=/tmp/ccufLak6.ltrans.out -fltrans @/tmp/ccK04Ekk -o ccufLak6.ltrans0.s

启用gdb调试(建议用cgdb)
cgdb --args 将你找到的那一行整个粘贴到这里
例如:
cgdb --args /home/gps/GCC/gcc-euler-bin/libexec/gcc/x86_64-linux-gnu/10.3.1/cc1 -fpreprocessed test.i -quiet -dumpbase test.c -mtune=generic -march=x86-64 -auxbase test -O3 -version -flto -o test.s

cgdb
b main即在main处设置断点。

在某个pass处设置断点的例子:
b pass_ipa_cp::gate

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值