[其它应用] 嵌入式Linux的GDB调试与常用命令

[复制链接]
 楼主| 两只袜子 发表于 2024-11-19 12:14 | 显示全部楼层 |阅读模式
1、GDB的部署   
建立gdb调试链接过程:
1、主机启动gdb,目标板启动服务器gdbserver。
2、同时注意所调试程序编译选项需要带-g选项增加调试信息,并且主机和目标板上的调试程序需保持一致。
3、开发板运行 : "gdbserver 主机IP:端口 ./被调试的程序"。
4、在ubuntu主机上运行gdb:"arm-none-linux-gdb 被调试程序"。
5、在ubuntu主机中开始使用gdb连接开发板:" target remote 开发板IP:端口",这样便进入了gdb调试状态,然后在ubuntu主机上输入对应的gdb命令便可调试程序了。
2、GDB常用命令   以下是15个常用的GDB调试命令,有效地进行调试:
  • gdb <program>
    启动GDB并加载指定的可执行文件。
  • run(或r)
    启动程序的执行。可以带参数,例如run arg1 arg2。
  • break <location>(或b <location>)
    在指定位置设置一个断点。位置可以是行号、函数名或文件名+行号,例如break main或b 25。
  • continue(或c)
    从当前断点处继续执行程序,直到下一个断点或程序结束。
  • step(或s)
    单步执行程序,进入函数内部。
  • next(或n)
    单步执行程序,但不进入函数,直接执行到下一行。
  • finish
    继续执行当前函数直到返回,并显示返回值。
  • print <expression>(或p <expression>)
    打印指定表达式的值。例如,print x会显示变量x的当前值。
  • display <expression>
    每次程序停止时自动显示指定表达式的值。可以用来监控变量的变化。
  • backtrace(或bt)
    显示当前调用栈的信息,帮助分析程序的执行路径。
  • list(或l)
    显示当前执行的源代码位置附近的代码行。
  • watch <expression>
    设置观察点,当表达式的值发生变化时暂停程序。
  • info breakpoints
    显示当前设置的所有断点的信息。
  • delete <breakpoint_number>
    删除指定的断点。例如,delete 1会删除编号为1的断点。
  • quit(或q)
    退出GDB。
3、重要的调试命令   1. aw (Access Watchpoint)
  • 命令: aw <location>
  • 用途: 设置一个访问观察点,当程序读取或写入指定位置的内存时,程序将会停止。
  • 参数:
    • <location>: 可以是变量名、内存地址或表达式,例如 aw myVar 或 aw *0x12345678。
  • 示例:
    aw myVariable
    这将会在 myVariable 被读取或修改时停止程序。

2. rw (Read Watchpoint)
  • 命令: rw <location>
  • 用途: 设置一个只读观察点,当程序尝试读取指定位置的内存时,程序将会停止。如果该位置被写入,不会触发停止。
  • 参数:
    • <location>: 可以是变量名、内存地址或表达式,例如 rw myVar 或 rw *0x12345678。
  • 示例:
    rw myVariable
    这将会在 myVariable 被读取时停止程序,但在被修改时不会停止。

3.until 命令用于让程序继续执行直到当前堆栈帧返回或者到达一个特定的源代码行。这通常用于在调试时快速跳过一些不相关的代码块,直接运行到下一个重要的代码位置。
until 命令的用法:
  • 命令: until [location]
  • 语法:
    • until:不带参数时,将执行直到当前函数返回。
    • until <location>:可以指定一个源代码位置(行号)或地址,程序将继续执行直到到达该位置。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
szt1993 发表于 2024-11-20 10:03 | 显示全部楼层
GDB调试很实用的一个功能
tpgf 发表于 2024-12-3 08:29 | 显示全部楼层
通过命令行输入gdb来启动GDB调试器,通常需要带上要调试的程序名称,例如gdb my_program
xiaoqizi 发表于 2024-12-4 17:59 | 显示全部楼层
GDB是GNU计划的一部分,它允许开发者查看程序在执行过程中的内部状态,从而更好地理解程序的运行机制,找出并修复程序中的错误
木木guainv 发表于 2024-12-4 19:47 | 显示全部楼层
为了深入了解程序的执行流程,可以使用[size=0.875]step[size=0.875]next命令进行单步执行
磨砂 发表于 2024-12-4 21:33 | 显示全部楼层
在程序暂停时,可以使用[size=0.875]print命令查看变量的值,这对于理解程序的行为和逻辑非常有帮助
晓伍 发表于 2024-12-4 23:21 | 显示全部楼层
使用[size=0.875]continue命令可以继续执行程序直到下一个断点或程序结束;使用[size=0.875]quit命令可以退出GDB调试器
八层楼 发表于 2024-12-5 10:59 | 显示全部楼层
GDB支持许多高级功能,如条件断点、临时断点、监视点等
Bowclad 发表于 2024-12-13 14:51 | 显示全部楼层
gdb好用吗?一直没学会怎么调试
小夏天的大西瓜 发表于 2024-12-15 22:34 | 显示全部楼层
非常不错的实例
CarterERO 发表于 2024-12-18 11:32 | 显示全部楼层
有没有gdb的使用教程啊?
OKAKAKO 发表于 2024-12-22 20:45 | 显示全部楼层
嵌入式Linux的GDB调试
桃乐丝 发表于 2025-6-29 17:45 | 显示全部楼层
入式 Linux 的 GDB 调试需搭建交叉编译环境(如 arm-linux-gnueabihf-gdb),并在目标板运行 gdbserver,主机通过串口 / 网络连接。以下是常用命令及功能:
1. 连接与启动
gdb-multiarch 目标程序:启动 GDB(多架构版本)。
target remote IP:端口:连接目标板 gdbserver(如target remote 192.168.1.100:1234)。
file 程序路径:加载本地符号表(用于无符号的目标程序)。
2. 断点调试
break 行号/函数名:设置断点(如break main)。
tbreak:临时断点(触发一次后自动删除)。
condition 断点号 条件:条件断点(如condition 1 x>10)。
delete 断点号:删除断点。
disable/enable 断点号:禁用 / 启用断点。
3. 单步执行
next(n):单步执行(不进入函数)。
step(s):单步执行(进入函数)。
continue(c):继续执行至下一个断点。
finish:执行至当前函数返回。
4. 变量与内存
print 变量名:打印变量值(如print arr[0])。
p/x 变量:以十六进制打印(p/d十进制,p/o八进制)。
x/NFU 地址:查看内存(N = 数量,F = 格式如x十六进制,U = 单位如b字节)。
例:x/10xb &buf(查看 buf 地址开始的 10 个字节)。
set var 变量=值:修改变量(如set var i=0)。
5. 线程与堆栈
info threads:查看所有线程。
thread ID:切换到指定线程。
backtrace(bt):打印调用栈。
frame(f) 帧号:切换栈帧(查看局部变量)。
6. 调试技巧
catch signal SIGSEGV:捕获段错误(用于定位崩溃)。
watch 变量:监控变量变化(值改变时触发断点)。
set pagination off:关闭分页显示(长输出时)。
source 脚本.gdb:批量执行 GDB 命令(自动化调试)。
注意事项
编译时需添加-g参数保留符号表,避免-O2等高优化级别(可能导致变量位置异常)。
目标板 gdbserver 需与主机 GDB 版本匹配(如均为 GDB 12.1),否则可能无法解析断点。
网络调试时需确保目标板防火墙开放 gdbserver 端口(默认 1234)。

通过上述命令,可高效定位嵌入式 Linux 程序的逻辑错误、内存泄漏(配合 Valgrind)及实时运行状态。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

2122

主题

8117

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部