程序避免不了涉及到多线程.常用指令如下.
命令 | 简写形式 | 说明 |
---|---|---|
info thread | 显示当前进程内所有线程信息 | |
thread | 切换到num线程 | |
thread find | 寻找regexp在gdb中的id | |
info address |
结合上述图片理解,第一列的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
切换到指定线程堆栈.
命令 | 简写形式 | 说明 |
---|---|---|
backtrace | bt | 查看当前堆栈信息 |
frame | 切换到指定堆栈 | |
info address <fun_name> | 查看函数地址 | |
info symbol | 通过地址查看函数 |
碰到程序崩溃的时候,可以使用下图所示方式查看变量
从上到下就是调用层级的关系.第一例的数字就是堆栈编码.
可以使用frame <num>
进入到指定堆栈查看数据.
通过上述info address <fun_name>
和info symbol <addr>
可以定位函数和指针的对应关系.
程序崩溃不好定位,在执行程序前,输入如下指令.
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 程序文件名
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
:双窗口窗口模式,显示两个窗口
可以使用help <instruct_name>
查看官方使用说明.示例如下.
查看断点使用说明.
查看info使用说明.