GDB 与 GDBServer 远程调试基础命令详解

 


一、环境准备

  1. 目标机(嵌入式设备)​

    • 安装 gdbserver(如 arm-linux-gnueabihf-gdbserver

    • 启动 gdbserver并监听端口:

      bash
      复制
       
       
      gdbserver :2345 /path/to/program [args]  # 监听本地2345端口,运行程序
    • 若调试已运行进程:

      bash
      复制
       
       
      gdbserver :2345 --attach <PID>  # 附加到进程ID
  2. 主机(开发机)​

    • 安装交叉编译工具链的 GDB(如 arm-linux-gnueabihf-gdb

    • 启动 GDB 并加载程序:

      bash
      复制
       
       
      arm-linux-gnueabihf-gdb ./program

二、连接与调试基础命令

命令

作用

示例

target remote <IP>:<PORT>

连接到目标机的 GDBServer

(gdb) target remote 192.168.1.100:2345

file <program>

加载可执行文件(需与目标机程序一致)

(gdb) file ./program

list/ l

显示源码(默认显示当前位置前后10行)

(gdb) list main

break <location>

设置断点(函数名、行号、内存地址)

(gdb) break main

run/ r

启动程序执行(带参数可用 set args设置)

(gdb) run arg1 arg2

continue/ c

从断点继续执行至下一个断点或程序结束

(gdb) continue

step/ s

单步执行(进入函数内部)

(gdb) step

next/ n

单步执行(不进入函数)

(gdb) next

print <var>/ p

打印变量值(支持格式控制,如 x十六进制、d十进制)

(gdb) p/x 0x1234

backtrace/ bt

查看调用栈(显示函数调用链)

(gdb) bt

info breakpoints

列出所有断点信息

(gdb) info breakpoints

delete <BP_NUM>

删除指定断点

(gdb) delete 1

finish

继续执行至当前函数返回

(gdb) finish


三、调试场景示例

  1. 设置断点并单步调试

    bash
    复制
     
     
    (gdb) break main.c:10    # 在 main.c 第10行设置断点
    (gdb) run                # 启动程序
    (gdb) step               # 进入函数内部
    (gdb) next               # 跳过函数调用
    (gdb) p count            # 打印变量 count 的值
  2. 查看内存与寄存器

    • 查看内存内容:

      bash
      复制
       
       
      (gdb) x/4xw 0x20001000  # 从地址0x20001000读取4个32位字(十六进制)
    • 查看寄存器:

      bash
      复制
       
       
      (gdb) info registers    # 显示所有寄存器值
  3. 条件断点与观察点

    • 条件断点(当变量 i == 5时触发):

      bash
      复制
       
       
      (gdb) break 20 if i == 5
    • 监控变量变化:

      bash
      复制
       
       
      (gdb) watch my_var      # 当 my_var 值变化时暂停

四、高级调试技巧

  1. 远程调试附加进程

    bash
    复制
     
     
    (gdb) target remote :2345  # 连接到本地2345端口(默认)
  2. 加载核心转储文件

    bash
    复制
     
     
    (gdb) core-file core.dump  # 加载崩溃时的核心转储文件
  3. 多线程调试

    • 查看线程列表:

      bash
      复制
       
       
      (gdb) info threads
    • 切换线程:

      bash
      复制
       
       
      (gdb) thread 2           # 切换到线程2

五、常见问题解决

  1. 无法加载符号

    • 确保编译时添加 -g选项(保留调试信息)。

    • 使用 file命令重新加载程序。

  2. 连接失败

    • 检查防火墙是否放行端口(如 2345)。

    • 确认目标机和主机的 IP 地址正确。

  3. 段错误定位

    • 使用 catch signal SIGSEGV捕获信号:

      bash
      复制
       
       
      (gdb) catch signal SIGSEGV
      (gdb) run

六、总结

  • 核心流程​:

    gdbserver启动监听 → 主机 gdb连接 → 加载程序 → 设置断点 → 运行调试。

  • 关键命令​:break, step, next, print, backtrace是调试的核心工具。

  • 调试原则​:

    • 始终使用 -g编译程序。

    • 优先通过日志和断点缩小问题范围。

通过上述命令,可高效完成嵌入式 Linux 程序的远程调试。如需更复杂场景(如多进程、信号处理),可结合 GDB 脚本或 Python 扩展

 

posted on 2025-10-15 10:39  ENGINEER-F  阅读(4)  评论(0)    收藏  举报