gdb调试动态库,查看变量值

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值