Linux设备调试-GDB调试器
前言
“工欲善其事,必先利其器”,为了方便Linux驱动设备的开发和调试,建立舒适的开发环境、使用必要的软件工具,以及掌握常用的调试技巧是比较重要的。本篇介绍GDB调试器的主要功能和常见用法,同时在第三部分中,命令顺序按照使用频率由高到低编写,方便阅读和使用。
正文
一、GDB 4个主要功能
- 可按照工程师自定义的要求运行程序。
- 让被调试程序在工程师指定的断点处停住,断点可以是条件表达式。
- 程序被停住时,可检查此刻程序中所发生的事,并追踪上文。
- 动态地改变程序的执行环境。
二、GDB 使用实例
若有源文件get_timestamp.c,使用命令gcc -g get_timestamp.c -o get_timestamp编译(需添加-g参数生成调试信息),产生含调试信息的二进制文件get_timestamp,使用命令gdb get_timestamp进入调试状态。
三、调试常用命令
Ctrl+A+X 进入/退出调试界面
win cmd +5 调整命令窗口大小
fs cmd 操作键停在命令窗口
-
r 运行程序(run)
set args <参数1> <参数2> ...,可指定运行参数再运行。
若程序已启动,想重新运行可直接输入r。 -
b 设置断点(break)
b <function/linenum/*address/if <condition>>,可接函数名、行数、内存地址、条件表达式(如b main.c:10 if i==5)。
临时断点(只触发一次):tbreak <位置>(用法同b,但触发后自动删除)。 -
c 恢复运行(continue)
c [ignore_count],可接ignore_count,表示忽略其后多少次断点。 -
n 单步执行(next)
逐行执行,遇到函数调用时不进入函数内部。
若需进入函数内部单步执行,使用s(step)(如调用func()时,s会进入func函数体,n则直接执行完func()并返回)。 -
p 打印数据(print)
p <expr>,接表达式(变量也是一种表达式)。
p /<f> <expr>,f为输出格式,有:x(十六进制)、d(十进制)、o(八进制)、t(二进制)、c(字符格式)、f(浮点数格式)。
自动显示变量:display <变量名>(程序每次暂停时自动打印该变量,取消用undisplay <编号>,通过info display查看编号)。 -
info 查看调试信息(info)
- 查看断点:
info breakpoints(或info b),显示所有断点的编号、位置、触发次数等。 - 查看函数参数:
info args,显示当前函数的参数及值。 - 查看局部变量:
info locals,显示当前函数的所有局部变量及值。 - 查看线程(多线程调试):
info threads,列出所有线程的ID和状态。
- 查看断点:
-
bt 查看调用栈(backtrace)
显示函数调用关系(从当前执行位置到程序入口的层级),如bt会列出“栈帧编号+函数名+位置”(栈帧0为当前函数,数字越大越接近调用源头)。
切换栈帧:frame <帧编号>(或f <编号>,如f 1切换到上一层函数,可查看该层的变量和代码)。 -
u 跳出循环(until)
快速执行到当前循环体结束或指定行(如u 20直接运行到第20行)。
若需跳出当前函数(执行完函数并返回上一层),使用finish。 -
set 修改内存
set 变量名=0,直接修改程序中变量的值(如set count=10强制改变计数器值)。
也可通过set variable <变量名>=<值>明确指定修改变量(兼容性更好)。 -
其他常用命令
- 删除断点:
delete <断点编号>(删除指定断点)、delete(删除所有断点);禁用/启用断点:disable <编号>/enable <编号>。 - 查看源代码:
list(或l,默认显示当前行附近10行,可加行号/函数名,如l main)。 - 退出调试:
quit(或q);强制终止程序:kill(终止当前调试的程序,保留调试环境)。 - 焦点切换:
focus 窗口名,窗口名:src 源代码区域、cmd 命令行区域、asm 汇编代码区域、regs 寄存器区域) - 窗口高度调整:
winheight <窗口名> [+/-]<行数>,无 +/-:直接设置窗口高度为指定行数(如 winheight src 20 固定为 20 行)
- 删除断点:
四、参考来源
书籍《Linux设备驱动开发详解:基于最新的Linux 4.0内核》第21章

浙公网安备 33010602011771号