1、概述
最近调试程序出现core dump,崩溃到动态库中,本文讲解该问题的分析和排查过程。
2、问题现象
运行程序出现coredump
通过gdb查看coredump,查看崩溃堆栈,但是函数后没有源文件及行号。
切换到对应函数帧中,使用p命令产看堆栈,报错"No symbol task_queue" in current context
3、问题原因
动态库编译时未加-g参数,动态库没有符号,所以使用gdb无法看到动态库中的内容。
正常编译:
gcc -o libthread_pool.so thread_pool.c -fPIC -shared -lpthread
如果要查看动态库中函数及变量:
gcc -o libthread_pool.so thread_pool.c -fPIC -shared -lpthread -g
4、排查
使用带-g参数编译的动态库,再分析dump,可以看到函数及源码和行号,如下:
切换到get_task函数帧中,查看变量:
此时发现问题,函数入参task_queue为空指针。
于是排查分析代码,看看参数如何传过来,最终发现初始化时代码写的有问题,直接返回了,相当于根本没初始化(可能当时写的笔误);修改后,程序运行正常。
5、总结
1、使用gdb查看某个模块,一定要使用-g参数编译对应模块
2、使用命令frame i(例:frame 1)切换堆栈中的函数
3、使用p命令查看对应变量的值
学习链接:https://github.com/0voice