【问题标题】:Debugging/tracing inside a shared library during runtime?在运行时在共享库中调试/跟踪?
【发布时间】:2010-11-23 04:15:45
【问题描述】:

我正在尝试了解某个库的工作原理。我已经用我添加的打印对其进行了编译,一切都很棒。现在我想在运行时停止示例程序以查看调用堆栈,但我不太清楚如何使用 gdb 来执行此操作。我要中断的功能位于共享库中。我已经在 SO 上查看了previous question,但这种方法对我不起作用。有问题的语言是 C++。我试图提供文件名和行号,但 gdb 拒绝理解,它只列出了演示应用程序中的源文件。

有什么建议吗?

【问题讨论】:

    标签: c++ debugging gdb shared-libraries


    【解决方案1】:

    看看这个:

    http://linux.die.net/man/1/ltrace

    它将跟踪您的库调用 - 可能很有用。

    而“strace”对系统调用做同样的事情。

    这样你应该能够找到一个入口点......你可以在 GDB 中设置一个断点(虽然我自己无法解释细节)

    【讨论】:

      【解决方案2】:

      有两种情况需要考虑(您的问题并没有说明您有哪种情况):
      - 您的可执行文件直接与共享库链接:
      这意味着GDB 将在您停止在 main
      - 您的可执行文件动态加载共享库(例如通过dlopen):
      在这种情况下,GDBdlopen 完成之前不会“看到”您的共享库。

      因为当你停在 main 时看不到符号,我猜你有第二种情况。 您可以在 (gdb) 提示符处执行 "set stop-on-solib-events 1",并且每次加载(或卸载)新的共享库时,GDB 都会停止。

      您可以通过info shared 命令查看GDB“知道”哪些库。
      等到您在该列表中看到您的目标库,然后再尝试在其中设置断点。

      【讨论】:

      • 此解决方案在调试 Oracle 的 SQLPlus 客户端应用程序时不起作用
      【解决方案3】:

      你可以先做“break main”。当您点击它时,应该会加载共享库,然后您可以在其任何例程中设置断点。

      【讨论】:

      • 是的,但请确保您使用 -g 编译了该库,并关闭了优化!
      • 不幸的是,这没有帮助。该功能仍然不可见,即使从 main 中也是如此。有什么我可以添加到代码中以导致执行停止并进入调试器的吗?
      • @EightyEight:嗯,这对我有用。您尝试调试的库是否可能通过 dlopen() 动态加载?这可以解释为什么它在 main.js 中仍然不可见。如果是这种情况,您可以在目标库的 dlopen 调用之后设置初始断点,然后设置最终断点。似乎应该有一种更简单的方法;我会继续寻找。
      • 顺便说一下,在我的应用程序中,如果我尝试在进入 main() 之前在共享库中设置断点,GDB 会提供使断点在未来共享库加载时挂起。但是,如果我接受这一点,即使在加载库之后,它似乎也无法解决断点。我想这也是你所看到的?
      • 是的,我不得不用 -g 重新编译库。出于某种原因,它仍然不喜欢 Class::Function() 表示法,但 File.cpp:linenumber 就像一个魅力。
      猜你喜欢
      • 2014-09-28
      • 2010-10-22
      • 2018-08-04
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      相关资源
      最近更新 更多