gpt4 book ai didi

debugging - gnu ld/gdb : separate debug files. 当需要链接的调试信息太多时如何生成调试文件?

转载 作者:行者123 更新时间:2023-12-04 18:10:01 24 4
gpt4 key购买 nike

现在有 gdbbinutils支持将调试信息与要调试的二进制文件分开。可以在以下位置找到描述此内容的文档:

  • gdb: separate debug files
  • objcopy --add-gnu-debuglink, --only-keep-debug
  • ld --build-id

  • 经过一些实验,我能够得到 gdb (7.6) 使用 build-id 和 debug-link 方法查找调试信息。这是两个 gdb显示调试器在非标准位置找到调试信息的片段,分别使用 build-id 和 debug-link 方法:
    (gdb)  set debug-file-directory .
    (gdb) file uWithBuildId
    Reading symbols from /home/peeterj/build-id/uWithBuildId...Reading symbols from /home/peeterj/build-id/.build-id/2d/41caac1bcbeb65255abc3f35624cf9ed37791a.debug...done.


    Reading symbols from /home/peeterj/build-id/uWithDebugLink...Reading symbols from /home/peeterj/build-id/uWithDebugLink.debug...done.

    要创建我使用过的调试信息文件 objcopystrip .我在下面提供了此类命令的详细信息以供引用。

    然而,我之所以关注这个,是希望能够用 -g 构建我们所有的产品代码。 .目前,如果我们尝试,这会破坏调试器,因为我们的共享库太大,重定位被截断以适合以下消息:
    /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64/crtn.o:(.debug_aranges+0x6):     relocation truncated to fit: R_X86_64_32 against `.debug_info'

    (以及随后的链接失败)

    有没有人知道一种方法来执行以下操作之一:
  • 生成一个独立文件,其中包含来自对二进制文件有贡献的所有源的所有调试信息(即所有 .o 和 .a 最终出现在生成二进制文件的 ld 命令中)。
  • 或者,指示 ld链接而不在二进制文件本身中包含此调试信息,并生成可以使用构建 ID 或调试链接标识的独立调试文件?我在文档中没有看到任何有关使用 ld 执行此操作的单次传递方法的内容,但 ld文档很大,也许我错过了。
  • 处理上述截断错误的某种方法(这种方法将允许 build-id 或 debug-link 方法工作)。

  • 为可执行文件生成单独调试文件的示例命令

    这是一个使用 --build-id 的示例命令行序列和 --add-gnu-debuglink方法:
    g++ -g   -c -o u.o u.cpp
    g++ -o uWithBuildId -Wl,--build-id u.o
    g++ -o uWithDebugLink u.o
    copyDebugAndStrip uWithBuildId
    objcopy --only-keep-debug uWithDebugLink uWithDebugLink.debug
    objcopy --add-gnu-debuglink=uWithDebugLink.debug uWithDebugLink
    strip -g uWithDebugLink

    其中 copyDebugAndStrip 是以下 perl 代码:
    #!/usr/bin/perl

    my $binary = $ARGV[0] ;
    my @p = `objdump --section .note.gnu.build-id -s $binary | tail -2` ;
    foreach (@p)
    {
    chomp ;
    s/^ *[\da-f]+ *// ;
    s/ .*// ;
    s/ //g ;
    }

    my $buildid = "$p[0]$p[1]" ;
    $buildid =~ /^(..)(.*)/ ;

    my ($d, $r) = ($1, $2) ;

    print "build-id for '$binary': $buildid\n" ;

    my $cmd =
    "mkdir -p .build-id/$d
    rm -f .build-id/$d/$r.debug
    objcopy --only-keep-debug $binary .build-id/$d/$r.debug
    strip -g $binary
    " ;

    print $cmd ;
    system $cmd ;

    最佳答案

    最初似乎是binutils gold linker 能够构建大型 -g 共享库,为上述 (3) 提供了解决方案,但是,事实证明这是因为缺少错误检查。

    另一方面,如果使用前沿工具链,则 (1) 和 (2) 的工作似乎可用,此处描述了裂变 dwarf/binutils/gcc 工作的一部分:

  • http://gcc.gnu.org/ml/gcc/2011-10/msg00326.html
  • http://gcc.gnu.org/wiki/DebugFission

  • 在讨论有关此重定位截断错误的 bugzilla 报告时提到了此裂变工作:

    http://sourceware.org/bugzilla/show_bug.cgi?id=15444

    使用此拆分调试文件的示例是:
    g++ -gsplit-dwarf -gdwarf-4   -c -o main.o main.cpp
    gcc -gsplit-dwarf -gdwarf-4 -c -o d1/t1.o d1/t1.c
    g++ -gsplit-dwarf -gdwarf-4 -c -o d2/t2.o d2/t2.cpp
    gcc -Wl,--index-gdb main.o d1/t1.o d2/t2.o -o main

    哪里 gcc/ g++是 4.8 版, binutils中继 ( cvs -z 9 -d :pserver:anoncvs@sourceware.org:/cvs/src co binutils ) 已使用配置为 --enable-gold=default ,最后使用可以读取拆分调试信息的 gdb 7.6 版。

    加入gcc党,intel(16版)编译器支持-gsplit-dwarf。需要 binutils-2.24+,gdb-7.6.1+ 的 intel 编译器文档。 clang 编译器代码库有一些 split dwarf 支持,但我不知道这种支持处于什么状态。

    关于debugging - gnu ld/gdb : separate debug files. 当需要链接的调试信息太多时如何生成调试文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16408893/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com