【问题标题】:Gdb function entry point not knownGdb 函数入口点未知
【发布时间】:2013-01-27 16:29:33
【问题描述】:

我正在使用我拥有的供应商 API,我可以设置断点并且它们运行良好,但是如果我尝试在 gdb 中调用一个函数(按其名称),它会显示“入口点地址未知”。 ,这是什么意思,有什么解决方法吗?我试过谷歌搜索,但没有发现任何有用的东西。非常感谢您的帮助。下一步我正在考虑使用 objdump 获取函数的地址,然后尝试直接使用地址调用,如果它有效的话。但我不知道具体怎么做,请在这里指导我,供应商库与我自己的程序动态链接

编辑 1: 做完“信息地址”函数”后,我尝试像“调用(*”地址“)(参数)”一样调用,仍然显示相同的错误,注意它确实知道函数地址。

【问题讨论】:

  • 您是否使用调试符号(即 gcc 或 clang 的 -g 标志)构建了供应商库?
  • @CarlNorum 如果库没有调试符号,断点会命中吗?
  • 可能,是的。函数名称不是调试信息中唯一包含的内容,即使没有,也经常包含。
  • 但是如果我说--b“有趣”,我可以打断点,而且我可以看到源代码,这是否意味着它有调试符号?
  • @avd - 我想是的,是的。对不起,我想我误解了你的问题。你想直接从 gdb 命令行调用函数吗?

标签: c linux debugging gdb


【解决方案1】:

这是一个不起眼的!

当进行低级调用时,gdb 有几个选项用于放置它创建的虚拟堆栈帧。在您的情况下,它选择“入口点” - 基本上(我认为)_start 处的内存,它执行一次,然后不再使用。这种选择似乎是特定于架构的。

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

【讨论】:

  • 我在使用 gdb-multiarch 调试 ARM 设备上的 Android 应用程序时发生了这种情况。 @Tom Tromey,您知道任何解决方法吗?
  • 找到了解决我的问题的方法:我试图在 ARM 设备中运行剥离的 .so 并设置 gdb 以在 x86 机器中查找未剥离的 .so。当我部署剥离版本时,我能够从 gdb 调用函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
相关资源
最近更新 更多