2、gdb常用功能2

1.4、线程

程序避免不了涉及到多线程.常用指令如下.

命令简写形式说明
info thread显示当前进程内所有线程信息
thread 切换到num线程
thread find 寻找regexp在gdb中的id
info address
set scheduler-locking on只运行当前线程
set scheduler-locking on运行所有线程
thread apply <gdb_cmd>指定某线程执行某gdb指令

在这里插入图片描述

结合上述图片理解,第一列的id是gdb内部为线程排序的一个id,第三列中的id为代码中实际的id.

thread <num>中的num为第一列中的id

thread find <regexp>中的regexp为第三列中的id,输出的id为第一列的id.

上述要结合代码一起使用作用更明显.

char *p_name = "thread_name";
pthread_create(&dev->thread, NULL, process_thread, NULL);
pthread_setname_np(dev->thread, p_name);

代码中的dev->thread存储的即为第三列中的值,如果没有使用pthread_setname_np为线程命名,则可以使用thread find dev->thread找到线程在gdb中对应的id,然后使用thread num切换到指定线程堆栈.

在运行多线程的时候,经常会遇到程序停止到端点后,输入n后程序编程全速运行了,可使用set scheduler-locking on将除去当前堆栈之外的所有线程暂停运行,只运行当前线程进行调试,调试结束后可使用set scheduler-locking off打开所有线程运行.

当程序执行到a线程时,此时需要针对线程b进行一些操作,可以使用frame指令切换到线程b堆栈后,在单独执行执行,后续在切换会a线程, 也可以使用 thread apply <thread id> <gdb_cmd>针对线程b进行单独的指令操作,省去来回切换的麻烦.

1.5、堆栈

命令简写形式说明
backtracebt查看当前堆栈信息
frame 切换到指定堆栈
info address <fun_name>查看函数地址
info symbol 通过地址查看函数

碰到程序崩溃的时候,可以使用下图所示方式查看变量

在这里插入图片描述

从上到下就是调用层级的关系.第一例的数字就是堆栈编码.

可以使用frame <num>进入到指定堆栈查看数据.

通过上述info address <fun_name>info symbol <addr>可以定位函数和指针的对应关系.

1.6、内存快照

程序崩溃不好定位,在执行程序前,输入如下指令.

 ulimit  -c unlimited

在执行程序,则程序崩溃后,会在当前目录自动保存一个叫做core的文件.

后续输入gdb <exce> core即可进入到程序崩溃前的堆栈环境,之后利用上述堆栈和线程相关指令查看内部数据使用情况. 后续根据断点和观察点等指令快速调试定位问题.

可通过修改/proc/sys/kernel/core_pattern文件内容使得每次程序崩溃后保留文件名字不同.

参数说明

%% 单个%字符
%p dump进程的进程ID
%u dump进程的用户ID
%g dump进程的组ID
%s 导致core dump的信号
%t core dump 的时间
%h 主机名
%e 程序文件名

1.7、布局

gdb默认是不显示源码和汇编的.

可通过下列指令切换显示状态.

命令简写形式说明
layout name仅支持四种.
src: 源码
asm:汇编
split: 分割
regs:寄存器
focus 将光标聚集到指定窗口.比layout多支持两个参数.
next: 下一个窗口
prev: 上一个窗口
winheight +/- 将指定窗口设定为line个高度
name同layout仅4个选项
refresh刷新所有窗口
update更新源代码窗口和当前执行点

使用layout <names>后,使用ctrl+x+a切换回默认窗口.

ctrl+l可以刷新窗口.

ctrl+x+1:单窗口模式,显示一个窗口

ctrl+x+2:双窗口窗口模式,显示两个窗口

1.8、帮助指令

可以使用help <instruct_name>查看官方使用说明.示例如下.

查看断点使用说明.

在这里插入图片描述

查看info使用说明.

在这里插入图片描述

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值