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

时间:2017-11-08 21:17:16

标签: linux 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 %d\n", 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的映射范围内。

1 个答案:

答案 0 :(得分:0)

  

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

(gdb) info shared

会告诉您foo.so的加载地址。说它是$addr

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

将告诉GDB从foo.so

添加foo.so.debug的调试符号

<强>更新

  

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

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

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

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

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