C++使用GDB调试

一、问题

使用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行代码。
(gdb) list

或使用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库崩溃位置定位的,有兴趣的可以自己尝试。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容