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

pts*_*pts 10 linux gdb shared-libraries

我想使用GDB调试在Linux 2.6上运行的进程.attach PID(其中,PID是进程ID), ,,print main 和工作(即,他们发现各个符号).但是不起作用,从文件使用的进程加载的函数在哪里.这是我得到的:print sinprint gzopenprint dlopenprint myfoomyfoo.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.
Run Code Online (Sandbox Code Playgroud)

如何找到GDB myfoo

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

原来,GDB mydir/mylib.so: No such file or directoryattach $PID命令打印出一条错误消息.显然GDB是在错误的目录中启动的.cd在启动GDB之前做正确的事情解决了问题,并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这样的其他操作系统呢?

小智 5

gdb中的“ info target”命令将显示所有已加载的共享库(包括dlopen()库)中所有节的列表。至少这在Linux上有效-我不知道它在其他操作系统上的行为。


pts*_*pts 0

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