我正在努力了解某个图书馆是如何运作的。我用我添加的原件编译了它,一切都很棒。现在我想在运行时停止示例程序以查看调用堆栈,但我无法弄清楚如何使用gdb来完成它。我想要破解的功能是在共享库中。我已经在SO上审核了previous question,但这种方法对我不起作用。有问题的语言是C ++。我试图提供文件名和行号,但gdb拒绝理解,它只列出了演示应用程序中的源文件。
有什么建议吗?
答案 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的方式设置断点(虽然我自己无法解释细节)