我有两个文件 - 共享对象文件和调试信息文件。 如何在不更改文件,文件名或创建链接的情况下告诉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的映射范围内。
答案 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
的(第一个)地址。)