一、问题
使用c++进行部署时,将算法打包成动态库以便其他人调用,但偶尔会出现崩溃的情况,难以定位问题所在。因此可以在开发阶段使用gdb快速进行问题定位。
二、方案
2.1 动态库编译
gdb会自动加载动态库,在编译动态库时添加-g
选项,这样调试时可以看到源代码位置。
g++ -g -shared -o libtest.so testobj.o
如使用cmake编译,则可以在CMakwLists.txt
文件中加入add_definitions("-Wall -g")
。
2.2运行调试
使用gdb运行可执行文件:
gdb ./a.out
将会自动使用gdb模块运行可执行文件。
输入指令
r
,将会自动运行直至终止或触发中断。(更多指令)
如触发中断将如上所示,提示错误类型及位置。注意,此时显示的为底层错误类型及位置,如
ostream
。我们需要定位我们代码中的错误位置,可以使用
list
,得到中断位置前后10行代码。或使用
bt
,来打印当前的函数调用栈的所有信息。从上图中,我们就可以找到该位置的所有调用关系,从而确定中断发生在编译动态库的.cpp文件中的644行。
三、致谢参考
https://www.cnblogs.com/pugang/p/4005798.html
https://www.cnblogs.com/taolusi/p/9293290.html
https://www.cnblogs.com/bleachli/p/4363485.html
四、其他
该方法适用于动态库同样由自己编译的情况。
网上看到有使用addr2line和objdump进行.so库崩溃位置定位的,有兴趣的可以自己尝试。