我想使用GDB调试在Linux 2.6上运行的进程。 attach PID
(其中PID是流程ID),print main
,print sin
,print gzopen
和print dlopen
工作(即他们找到相应的符号)。但是print myfoo
不起作用,myfoo
是使用.so
从dlopen
文件加载的函数。这是我得到的:
(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呢?
答案 0 :(得分:4)
&#34; info target&#34; gdb中的命令将显示所有已加载的共享对象(包括dlopen()ed库)中所有部分的列表。至少这适用于Linux - 我不知道它在其他操作系统上的表现。
答案 1 :(得分:0)
我维护一个程序,通过dlopen()加载共享库,并使用GDB成功访问共享库中的符号。但是,只有共享库具有符号表时,这才有效。
答案 2 :(得分:0)
看起来没有简单的方法可以自动在GDB中查找.so
个文件。