Linux设备调试-GDB调试器

前言

“工欲善其事,必先利其器”,为了方便Linux驱动设备的开发和调试,建立舒适的开发环境、使用必要的软件工具,以及掌握常用的调试技巧是比较重要的。本篇介绍GDB调试器的主要功能和常见用法,同时在第三部分中,命令顺序按照使用频率由高到低编写,方便阅读和使用。

正文

一、GDB 4个主要功能

  1. 可按照工程师自定义的要求运行程序。
  2. 让被调试程序在工程师指定的断点处停住,断点可以是条件表达式。
  3. 程序被停住时,可检查此刻程序中所发生的事,并追踪上文。
  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 操作键停在命令窗口

  1. r 运行程序(run)
    set args <参数1> <参数2> ...,可指定运行参数再运行。
    若程序已启动,想重新运行可直接输入r

  2. b 设置断点(break)
    b <function/linenum/*address/if <condition>>,可接函数名、行数、内存地址、条件表达式(如b main.c:10 if i==5)。
    临时断点(只触发一次):tbreak <位置>(用法同b,但触发后自动删除)。

  3. c 恢复运行(continue)
    c [ignore_count],可接ignore_count,表示忽略其后多少次断点。

  4. n 单步执行(next)
    逐行执行,遇到函数调用时不进入函数内部。
    若需进入函数内部单步执行,使用s(step)(如调用func()时,s会进入func函数体,n则直接执行完func()并返回)。

  5. p 打印数据(print)
    p <expr>,接表达式(变量也是一种表达式)。
    p /<f> <expr>f为输出格式,有:x(十六进制)、d(十进制)、o(八进制)、t(二进制)、c(字符格式)、f(浮点数格式)。
    自动显示变量:display <变量名>(程序每次暂停时自动打印该变量,取消用undisplay <编号>,通过info display查看编号)。

  6. info 查看调试信息(info)

    • 查看断点:info breakpoints(或info b),显示所有断点的编号、位置、触发次数等。
    • 查看函数参数:info args,显示当前函数的参数及值。
    • 查看局部变量:info locals,显示当前函数的所有局部变量及值。
    • 查看线程(多线程调试):info threads,列出所有线程的ID和状态。
  7. bt 查看调用栈(backtrace)
    显示函数调用关系(从当前执行位置到程序入口的层级),如bt会列出“栈帧编号+函数名+位置”(栈帧0为当前函数,数字越大越接近调用源头)。
    切换栈帧:frame <帧编号>(或f <编号>,如f 1切换到上一层函数,可查看该层的变量和代码)。

  8. u 跳出循环(until)
    快速执行到当前循环体结束或指定行(如u 20直接运行到第20行)。
    若需跳出当前函数(执行完函数并返回上一层),使用finish

  9. set 修改内存
    set 变量名=0,直接修改程序中变量的值(如set count=10强制改变计数器值)。
    也可通过set variable <变量名>=<值>明确指定修改变量(兼容性更好)。

  10. 其他常用命令

    • 删除断点: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章

posted @ 2025-08-01 09:13  奈宁樱兰  阅读(22)  评论(0)    收藏  举报