我有两个文件 - 共享对象文件和调试信息文件。如何告诉 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.debug
为foo.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
。