gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:16:53 25 4
gpt4 key购买 nike

我有两个文件——共享目标文件和调试信息文件。我如何告诉 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 session 是这样的:

    (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 的映射范围内。

最佳答案

How can I tell GDB to use the symbols file for that shared object without altering the files, file names or creating links?

(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。第二个地址来自info proc map,用于(第一个)地址,其中libc.so.6 已加载。)

关于linux - 如何在不更改文件的情况下将共享对象指向 GDB 中的调试信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47189844/

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