在运行时期间在共享库中调试/跟踪?

时间:2009-08-26 21:11:29

标签: c++ debugging gdb shared-libraries

我正在努力了解某个图书馆是如何运作的。我用我添加的原件编译了它,一切都很棒。现在我想在运行时停止示例程序以查看调用堆栈,但我无法弄清楚如何使用gdb来完成它。我想要破解的功能是在共享库中。我已经在SO上审核了previous question,但这种方法对我不起作用。有问题的语言是C ++。我试图提供文件名和行号,但gdb拒绝理解,它只列出了演示应用程序中的源文件。

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

你可以先做“破主”。当你点击它时,应该加载共享库,然后你可以在它的任何例程中设置一个断点。

答案 1 :(得分:3)

有两种情况需要考虑(你的问题并不清楚你有哪种情况):
- 您的可执行文件直接与共享库链接:
  这意味着GDB将在主要停止时“看到”来自共享库的符号(和来源) - 您的可执行文件动态加载共享库(例如通过dlopen):
在这种情况下,GDB只有在dlopen完成后才会“看到”您的共享库。

由于你在主要站点停留时看不到符号,我猜你有第二种情况。 您可以在"set stop-on-solib-events 1"提示符下执行(gdb),每次加载(或卸载)新的共享库时,GDB都会停止。

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

答案 2 :(得分:1)

检查出来:

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

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

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

然后你应该能够找到一个入口点......你可以用GDB的方式设置断点(虽然我自己无法解释细节)