linux – 如何在使用dlopen加载的共享库中创建gdb打印符号?

linux – 如何在使用dlopen加载的共享库中创建gdb打印符号?,第1张

概述我想使用GDB调试在 Linux 2.6上运行的进程.附加PID(其中PID是进程ID),print main,print sin,print gzopen和print dlopen work(即它们找到相应的符号).但是打印myfoo不起作用,其中myfoo是使用dlopen从.so文件进程加载的函数.这是我得到的: (gdb) print main$3 = {int (int, char * 我想使用GDB调试在 Linux 2.6上运行的进程.附加PID(其中PID是进程ID),print main,print sin,print gzopen和print dlopen work(即它们找到相应的符号).但是打印myfoo不起作用,其中myfoo是使用dlopen从.so文件进程加载的函数.这是我得到的:
(gdb) print main = {int (int,char **)} 0x805ba90 <main>(gdb) print sin = {<text variable,no deBUG info>} 0xb7701230 <sin>(gdb) print gzopen = {<text variable,no deBUG info>} 0xb720df50 <gzopen>(gdb) print dlopen = {<text variable,no deBUG info>} 0xb77248e0 <__dlopen_nocheck>(gdb) print myfooNo symbol "myfoo" in current context.

如何让GDB找到myfoo?

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

原来,有一个mydir / mylib.so:没有这样的文件或目录错误消息由GDB的attach $PID命令打印.显然GDB是在错误的目录中启动的.在启动GDB之前做正确的cd修复了问题,打印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 @R_403_6852@或directory.我如何告诉GDB在哪里寻找mydir / myfoo.so?

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

解决方法 gdb中的“info target”命令将显示所有已加载的共享对象(包括dlopen()ed库)中所有部分的列表.至少这适用于linux – 我不知道它在其他 *** 作系统上的表现如何. 总结

以上是内存溢出为你收集整理的linux – 如何在使用dlopen加载的共享库中创建gdb打印符号?全部内容,希望文章能够帮你解决linux – 如何在使用dlopen加载的共享库中创建gdb打印符号?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1039902.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存