如何在使用dlopen加载的共享库中制作gdb打印符号?

时间:2010-12-08 21:28:49

标签: linux gdb shared-libraries

我想使用GDB调试在Linux 2.6上运行的进程。 attach PID(其中PID是流程ID),print mainprint sinprint gzopenprint dlopen工作(即他们找到相应的符号)。但是print myfoo不起作用,myfoo是使用.sodlopen文件加载的函数。这是我得到的:

(gdb) print main
$3 = {int (int, char **)} 0x805ba90 <main>
(gdb) print sin
$4 = {<text variable, no debug info>} 0xb7701230 <sin>
(gdb) print gzopen
$5 = {<text variable, no debug info>} 0xb720df50 <gzopen>
(gdb) print dlopen
$6 = {<text variable, no debug info>} 0xb77248e0 <__dlopen_nocheck>
(gdb) print myfoo
No symbol "myfoo" in current context.

如何让GDB找到myfoo

函数myfoo确实存在,因为在程序中我设法使用dlsym(在dlopen之后)获取其地址,然后我设法调用它。只有在那之后我才将GDB附加到流程中。

事实证明,GDB的mydir/mylib.so: No such file or directory命令打印了attach $PID错误消息。显然GDB是在错误的目录中启动的。在启动GDB之前执行正确的cd修复了问题,print myfoo开始工作。

我想自动执行此操作:我希望GDB找出我的.so文件(加载dlopen)的位置。我能想到的一个近似是检查/proc/$PID/maps(在Linux上),找到可能的目录,并在启动GDB之前将所有这些目录添加到GDB库搜索路径中。扩展LD_LIBRARY_PATH并执行set solib-search-path /tmp/parent无效(ls -l /tmp/parent/mydir/myfoo.so确实有效),GDB仍然报告了No such file or directory。如何告诉GDB在哪里查找mydir/myfoo.so

我的另一个问题是如何获取可能的目录列表?在Linux上,/proc/$PID/maps包含它们 - 但是其他操作系统如FreeBSD和Mac OS X呢?

3 个答案:

答案 0 :(得分:4)

&#34; info target&#34; gdb中的命令将显示所有已加载的共享对象(包括dlopen()ed库)中所有部分的列表。至少这适用于Linux - 我不知道它在其他操作系统上的表现。

答案 1 :(得分:0)

我维护一个程序,通过dlopen()加载共享库,并使用GDB成功访问共享库中的符号。但是,只有共享库具有符号表时,这才有效。

答案 2 :(得分:0)

看起来没有简单的方法可以自动在GDB中查找.so个文件。