GDB不会破坏动态加载的.so文件?

时间:2011-08-02 10:11:01

标签: linux gdb shared-libraries

在我的Linux系统中,我正在编写一个程序,在运行时动态加载一些.so库。它是这样的:可执行程序将在它开始运行时在特定目录下搜索,然后加载该目录中的所有.so文件。请注意,可执行文件和.so是独立构建的,并且可执行文件的构建会将 NOT 链接到.so文件。

我的问题是:在运行程序(因为所有.so库已加载)并附加了GDB之后,我似乎能够在.so文件中的代码上设置断点(GDB提示我这个断点是在共享库中设置的),但是这个断点实际上从未实际中断。

我应该如何使这些断点真正起作用?在调试会话期间,我在正确的位置提供了所有源代码,并且启用了-g选项。我在编译时也删除了-O2优化。

3 个答案:

答案 0 :(得分:5)

检查.so文件是否正确加载了调试信息。查看命令(gdb) info sharedlibrary的输出。如果您的库在加载的库表中显示带星号(*)符号,则未加载调试符号,并且gdb无法在此.so中的断点处停止。

答案 1 :(得分:2)

也许永远不会调用你的函数。在共享库的入口点放置一个断点(主程序使用dlsym获取的函数)。我刚刚确认我的gdb(7.1)确实停在这样的断点处。

如果你绝对确定你的函数被调用(比如,它会产生一些你可以看到的独特输出),但你在它上面设置的断点没有被触发,那么这是gdb中的一个错误,它应该是向gdb维护者报告。

答案 2 :(得分:-1)

上次发生在我身上时,我在 gdb 中运行

info sharedlibrary

才意识到我有多个版本的库,一个用调试符号构建,另一个没有调试符号。 gdb 捡到了一个没有。