在我的Linux系统中,我正在编写一个程序,在运行时动态加载一些.so库。它是这样的:可执行程序将在它开始运行时在特定目录下搜索,然后加载该目录中的所有.so文件。请注意,可执行文件和.so是独立构建的,并且可执行文件的构建会将 NOT 链接到.so文件。
我的问题是:在运行程序(因为所有.so库已加载)并附加了GDB之后,我似乎能够在.so文件中的代码上设置断点(GDB提示我这个断点是在共享库中设置的),但是这个断点实际上从未实际中断。
我应该如何使这些断点真正起作用?在调试会话期间,我在正确的位置提供了所有源代码,并且启用了-g选项。我在编译时也删除了-O2优化。
答案 0 :(得分:5)
检查.so文件是否正确加载了调试信息。查看命令(gdb) info sharedlibrary
的输出。如果您的库在加载的库表中显示带星号(*)符号,则未加载调试符号,并且gdb无法在此.so中的断点处停止。
答案 1 :(得分:2)
也许永远不会调用你的函数。在共享库的入口点放置一个断点(主程序使用dlsym
获取的函数)。我刚刚确认我的gdb
(7.1)确实停在这样的断点处。
如果你绝对确定你的函数被调用(比如,它会产生一些你可以看到的独特输出),但你在它上面设置的断点没有被触发,那么这是gdb
中的一个错误,它应该是向gdb
维护者报告。
答案 2 :(得分:-1)
上次发生在我身上时,我在 gdb 中运行
info sharedlibrary
才意识到我有多个版本的库,一个用调试符号构建,另一个没有调试符号。 gdb 捡到了一个没有。