如何在 GDB 中查找包含给定函数的共享对象的名称?
How to find name of a shared object that contains given function in GDB?
在 GDB 中,我可以观察到哪些源代码文件名和行号与当前执行状态、当前回溯中的其他位置以及许多其他上下文(例如断点)相关联。但是,如果我需要了解给定代码行来自哪个共享对象(*.so、*.dll 或其他类型的图像),我该如何了解?
之所以重要:假设我正在调试一个动态加载许多共享对象的复杂应用程序。在回溯输出中,我看到执行通过了源代码中我不熟悉的位置。我想重建包含调试信息的共享库,以简化我的下一个调试会话。但是为了做到这一点,我需要知道图书馆的名字。我只知道用于构建它的源文件的名称,因为它显示在调试器输出中。如何以最直接的方式进行?
I want to rebuild the encompassing shared library with debug information preserved to simplify my next debugging session.
通常这是错误的做法。相反,您应该使用调试信息构建 everything,并在将结果发送给最终用户之前使用 strip
(但保留未剥离的版本以供后续调试)。
I see that execution passes a position in source code which I am not familiar with.
使用 up
到达该级别,并使用 info symbol $pc
找出该符号的来源。示例:
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc > 0) abort();
return 0;
}
gcc -g t.c
gdb -q ./a.out
(gdb) run
Starting program: /tmp/a.out
Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) info sym $pc
raise + 321 in section .text of /lib/x86_64-linux-gnu/libc.so.6
(gdb) up
#1 0x00007ffff7e04537 in __GI_abort () at abort.c:79
79 abort.c: No such file or directory.
(gdb) info sym $pc
abort + 291 in section .text of /lib/x86_64-linux-gnu/libc.so.6
(gdb) up
#2 0x000055555555514f in main (argc=1, argv=0x7fffffffdb88) at t.c:3
3 if (argc > 0) abort();
(gdb) info sym $pc
main + 26 in section .text of /tmp/a.out
您也可以只显式使用地址而不进入函数:
(gdb) run
Starting program: /tmp/a.out
Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1 0x00007ffff7e04537 in __GI_abort () at abort.c:79
#2 0x000055555555514f in main (argc=1, argv=0x7fffffffdb88) at t.c:3
(gdb) info sym 0x00007ffff7e04537
abort + 291 in section .text of /lib/x86_64-linux-gnu/libc.so.6
(gdb) info sym 0x000055555555514f
main + 26 in section .text of /tmp/a.out
在 GDB 中,我可以观察到哪些源代码文件名和行号与当前执行状态、当前回溯中的其他位置以及许多其他上下文(例如断点)相关联。但是,如果我需要了解给定代码行来自哪个共享对象(*.so、*.dll 或其他类型的图像),我该如何了解?
之所以重要:假设我正在调试一个动态加载许多共享对象的复杂应用程序。在回溯输出中,我看到执行通过了源代码中我不熟悉的位置。我想重建包含调试信息的共享库,以简化我的下一个调试会话。但是为了做到这一点,我需要知道图书馆的名字。我只知道用于构建它的源文件的名称,因为它显示在调试器输出中。如何以最直接的方式进行?
I want to rebuild the encompassing shared library with debug information preserved to simplify my next debugging session.
通常这是错误的做法。相反,您应该使用调试信息构建 everything,并在将结果发送给最终用户之前使用 strip
(但保留未剥离的版本以供后续调试)。
I see that execution passes a position in source code which I am not familiar with.
使用 up
到达该级别,并使用 info symbol $pc
找出该符号的来源。示例:
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc > 0) abort();
return 0;
}
gcc -g t.c
gdb -q ./a.out
(gdb) run
Starting program: /tmp/a.out
Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) info sym $pc
raise + 321 in section .text of /lib/x86_64-linux-gnu/libc.so.6
(gdb) up
#1 0x00007ffff7e04537 in __GI_abort () at abort.c:79
79 abort.c: No such file or directory.
(gdb) info sym $pc
abort + 291 in section .text of /lib/x86_64-linux-gnu/libc.so.6
(gdb) up
#2 0x000055555555514f in main (argc=1, argv=0x7fffffffdb88) at t.c:3
3 if (argc > 0) abort();
(gdb) info sym $pc
main + 26 in section .text of /tmp/a.out
您也可以只显式使用地址而不进入函数:
(gdb) run
Starting program: /tmp/a.out
Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1 0x00007ffff7e04537 in __GI_abort () at abort.c:79
#2 0x000055555555514f in main (argc=1, argv=0x7fffffffdb88) at t.c:3
(gdb) info sym 0x00007ffff7e04537
abort + 291 in section .text of /lib/x86_64-linux-gnu/libc.so.6
(gdb) info sym 0x000055555555514f
main + 26 in section .text of /tmp/a.out