Gdb函数入口点未知。

5
我正在使用一个供应商提供的API,我拥有其源代码,我可以设置断点并成功调试,但是如果我尝试通过gdb调用函数(按名称),它会说“未知入口点地址”,这是什么意思?是否有任何解决方法?我尝试了谷歌搜索,但没有找到有用的东西。非常感谢任何帮助。下一步,我打算使用objdump获取函数的地址,然后直接尝试调用该地址,如果可以运行,则说明解决了问题。但是我不知道具体如何操作,请在此指导我,供应商库与我的程序动态链接。
编辑1: 在执行“info address 'function'”之后,我尝试像“call (* 'address') (params)”那样调用,仍然显示同样的错误,需要注意的是它确实知道该函数的地址。

3
你是否使用调试符号(例如,对于gcc或clang编译器的“-g”标志)构建了供应商库? - Carl Norum
很可能是的。调试信息中不仅包含函数名称,而且通常即使没有函数名称也会包含其他信息。 - Carl Norum
但如果我输入 b "fun",我可以触发断点,并且我可以查看源代码,这不是意味着它有调试符号吗? - avd
也许这个函数是内联的,或者实际上是一个宏?或者存在于动态加载的插件中? - vonbrand
这个函数既不是内联函数也不是宏函数。就像我之前说的,如果我设置一个断点,比如“b function”,我会命中那个断点,并且bt会在回溯中显示该帧,唯一的问题是我无法直接调用该函数。 - avd
显示剩余9条评论
1个回答

2

这是一个比较晦涩的问题。

在进行低级调用时,gdb有几个选项可以选择放置它所创建的虚拟栈帧的位置。在您的情况下,它选择了“入口点”——基本上是在 _start 处的内存,它只被执行一次,然后就再也没有被使用过。这个选择似乎与体系结构有关。

在您的情况下,gdb找不到入口点。如果您从未使用过“file”命令,或者您正在调试一个 .o 文件而不是一个真正的可执行文件,那么这种情况可能会发生,但似乎在某些其他更加晦涩的情况下也可能会发生。


使用gdb-multiarch调试ARM设备上的Android应用程序时,我遇到了这个问题。@Tom Tromey,你知道有什么解决方法吗? - Bruno Alexandre Rosa
发现了解决问题的方法:我试图在ARM设备上运行一个剥离过的.so文件,并设置gdb在x86机器上查找未剥离的.so文件。当我部署剥离版本后,我能够从gdb中调用函数。 - Bruno Alexandre Rosa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接