2、gdb常用功能2

1.4、线程

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

命令 简写形式 说明
info thread 显示当前进程内所有线程信息
thread 切换到num线程
thread find 寻找regexp在gdb中的id
info address

在这里插入图片描述

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

thread 中的num为第一列中的id

thread find 中的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切换到指定线程堆栈.

1.5、堆栈

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

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

在这里插入图片描述

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

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

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

1.6、内存快照

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

 ulimit  -c unlimited

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

后续输入gdb 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 后,使用ctrl+x+a切换回默认窗口.

ctrl+l可以刷新窗口.

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

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

1.8、帮助指令

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

查看断点使用说明.

2、gdb常用功能2_第1张图片

查看info使用说明.

2、gdb常用功能2_第2张图片

你可能感兴趣的:(#,调试,gdb)