如何在不更改文件的情况下将共享对象指向调试 GDB 中的信息



我有两个文件 - 共享对象文件和调试信息文件。如何告诉 GDB 在不更改文件、文件名或创建链接的情况下使用该共享对象的调试信息文件?甚至可能吗?

我只是想告诉GDB,而不是改变任何东西。

编辑:这是我正在尝试做的事情(在Ubuntu 16.04上,x86_64)我正在从我的系统中获取 libc 和 libc 调试信息文件,并将它们复制到新目录中。然后,我将移动的 libc 预加载到进程中,并使用 GDB 附加到该进程。

    sudo apt install libc6-dbg
    cp /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.23.so debug_file
    cp /lib/x86_64-linux-gnu/libc.so.6 .
    cat << EOF > traceme.c
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    int main(void) {
      printf("trace me:nsudo gdb -p %dn", getpid());
      sleep(20);
      return 0;
    }
    EOF
    gcc -o traceme traceme.c
    LD_PRELOAD=./libc.so.6 ./traceme &
    sudo gdb -p 28163

现在,我的 GDB 会话是这样的:

    (gdb) info sharedlibrary
    From                To                  Syms Read   Shared Object Library
    0x00007ff8e77c68b0  0x00007ff8e7919ac4  Yes (*)     ./libc.so.6
    0x00007ff8e7b71ac0  0x00007ff8e7b8f810  Yes         /lib64/ld-linux-x86-64.so.2
    (*): Shared library is missing debugging information.
    (gdb) add-symbol-file debug_file 0x00007ff8e77c68b0
    add symbol table from file "debug_file" at
        .text_addr = 0x7ff8e77c68b0
    (y or n) y
    Reading symbols from debug_file...done.
    (gdb) p &main_arena
    $1 = (struct malloc_state *) 0x3c4b20 <main_arena>
    (gdb) p main_arena
    Cannot access memory at address 0x3c4b20
    (gdb) info proc mappings
    process 28163
    Mapped address spaces:
              Start Addr           End Addr       Size     Offset objfile
                0x400000           0x401000     0x1000        0x0 /home/ubuntu/tmp/z/traceme
                0x600000           0x601000     0x1000        0x0 /home/ubuntu/tmp/z/traceme
                0x601000           0x602000     0x1000     0x1000 /home/ubuntu/tmp/z/traceme
                0xff8000          0x1019000    0x21000        0x0 [heap]
          0x7ff8e77a7000     0x7ff8e7967000   0x1c0000        0x0 /home/ubuntu/tmp/z/libc.so.6
          0x7ff8e7967000     0x7ff8e7b67000   0x200000   0x1c0000 /home/ubuntu/tmp/z/libc.so.6
          0x7ff8e7b67000     0x7ff8e7b6b000     0x4000   0x1c0000 /home/ubuntu/tmp/z/libc.so.6
          0x7ff8e7b6b000     0x7ff8e7b6d000     0x2000   0x1c4000 /home/ubuntu/tmp/z/libc.so.6
          0x7ff8e7b6d000     0x7ff8e7b71000     0x4000        0x0
          0x7ff8e7b71000     0x7ff8e7b97000    0x26000        0x0 /lib/x86_64-linux-gnu/ld-2.23.so
          0x7ff8e7d91000     0x7ff8e7d96000     0x5000        0x0
          0x7ff8e7d96000     0x7ff8e7d97000     0x1000    0x25000 /lib/x86_64-linux-gnu/ld-2.23.so
          0x7ff8e7d97000     0x7ff8e7d98000     0x1000    0x26000 /lib/x86_64-linux-gnu/ld-2.23.so
          0x7ff8e7d98000     0x7ff8e7d99000     0x1000        0x0
          0x7ffe53a5a000     0x7ffe53a7b000    0x21000        0x0 [stack]
          0x7ffe53b3a000     0x7ffe53b3c000     0x2000        0x0 [vvar]
          0x7ffe53b3c000     0x7ffe53b3e000     0x2000        0x0 [vdso]
      0xffffffffff600000 0xffffffffff601000     0x1000        0x0 [vsyscall]

出于某种原因,main_arena符号不在 libc 的映射范围内。

如何告诉 GDB 在不更改文件、文件名或创建链接的情况下使用该共享对象的符号文件?

(gdb) info shared

会告诉您foo.so在哪个地址加载。说是$addr.

(gdb) add-symbol-file /path/to/foo.so.debug $addr

将告诉 GDB 从foo.so.debugfoo.so添加调试符号

更新:


(gdb) p main_arena Cannot access memory at address 0x3c4b20

我很确定这是GDB中的一个错误。你是对的:它没有在应该重新定位.data部分时。

幸运的是,有一个解决方法:

(gdb) add-symbol-file debug_file 0x00007ff8e77c68b0 -s .data 0x7ff8e77a7000

(第一个地址来自info shared。第二个地址来自加载libc.so.6的(第一个)地址的info proc map

最新更新