[Debugger]调试Arm设备

GDB调试Arm设备

2024-7-5

hongxi.zhu

1. 调试Cortex-M设备

以stm32 mcu为例子

芯片:stm32c011

debugger probe: st-link v2.1

1.1 运行openocd

bash 复制代码
 openocd -f interface/stlink-v2.cfg  -f target/stm32c0x.cfg

1.2 运行gdb

bash 复制代码
arm-none-eabi-gdb .\STM32C011F6P6_WDT.elf

进入gdb环境,连接到设备

bash 复制代码
target extended-remote :3333
monitor reset
monitor halt
load

2. 调试Cortex-A设备

附录:gdb相关命令

  • 启动GDB

    gdb 文件名

  • 退出gdb

    quit

  • 程序的输入输出。

bash 复制代码
显示你程序用到的终端的模式。
info terminal

使用重定向控制程序输出。
如:run > outfile

tty命令可以指写输入输出的终端设备。
如:tty /dev/ttyb
  • 程序运行参数。
bash 复制代码
set args 可指定运行时参数。
(如:set args 10 20 30 40 50)

show args 命令可以查看设置好的运行参数。
  • 列出代码内容

    list 行号

  • 运行程序

    第一种:run 或者 r
    第二种:start

  • 设置断点

    breakpoint 行号 或者 b 行号

  • 列出断点信息

    info break 或者 info b

  • 删除断点

    delete 断点序号 或者 d 断点序号

  • 打开和关闭断点

    disable 断点序号
    enable 断点序号

  • 逐过程调试(不进入函数内部)

    next 或者 n

  • 单步调试

    step 或者 s

  • 查看堆栈信息(在函数间跳转时)

    backtrace 或者 bt

  • 结束堆栈(跳出当前函数回到调用的地方)

    finish

  • 查看变量的值

    print 变量名 或者 p 变量名

  • 长显示变量的值

    display 变量名
    undisplay 变量名

  • 修改变量的值

    set 变量名 = 值

  • 跳转到指定行

    until 行号

  • 跳转到下一个断点

    continue

  • 查看寄存器

bash 复制代码
info registers
  • 查看arm通用的r0~r15寄存器, 如r0
bash 复制代码
print $r0
  • TUI方式相关
bash 复制代码
layout:用于分割窗口,可以一边查看代码,一边测试。主要有以下几种用法:
layout src:显示源代码窗口
layout asm:显示汇编窗口
layout regs:显示源代码/汇编和寄存器窗口
layout split:显示源代码和汇编窗口
layout next:显示下一个layout
layout prev:显示上一个layout

Ctrl + L:刷新窗口
Ctrl + x,再按1:单窗口模式,显示一个窗口
Ctrl + x,再按2:双窗口模式,显示两个窗口
Ctrl + x,再按a:回到传统模式,即退出layout,回到执行layout之前的调试窗口
  • monitor命令相关(openocd gdbserver专属)
BASH 复制代码
1. 重置目标设备:
monitor reset
这个命令会重置目标设备(如STM32)到初始状态1。

2. 暂停目标设备:
monitor halt
这个命令会暂停目标设备的执行,以便进行调试1。

3. 设置和查询JTAG/SWD速度:
monitor jtag_khz 1000
monitor swd_khz 1000
monitor jtag_speed
monitor swd_speed
这些命令用于设置JTAG或SWD接口的通信速度,并查询当前速度2。

4. 查询和设置TAP(测试访问端口):
monitor tap <tap_name>
monitor tap_configure <tap_name>
这些命令用于查询和配置TAP,TAP是JTAG/SWD协议中用于访问目标设备内部组件的接口3。

5. 加载或擦除目标设备上的程序:
具体的命令可能依赖于你的硬件配置和使用的调试器,但通常你可以使用类似下面的命令来加载或擦除目标设备上的程序:
monitor flash bank select <bank_number>
monitor flash erase_address <address> <length>
monitor flash write_image erase <filename> <address>
这些命令用于选择闪存银行、擦除指定地址的闪存内容、以及将映像文件写入到目标设备的闪存中4。

6. 查询目标设备信息:
monitor target_info
这个命令用于查询目标设备的信息,如设备ID、处理器类型等2。
  • 反汇编代码
bash 复制代码
disassemble 或 disas
  • 设置观察点(WatchPoint)
bash 复制代码
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:

watch <expr>
为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。

rwatch <expr>
当表达式(变量)expr被读时,停住程序。

awatch <expr>
当表达式(变量)的值被读或被写时,停住程序。

info watchpoints
列出当前所设置了的所有观察点。
  • 设置捕捉点(CatchPoint)
bash 复制代码
你可设置捕捉点来捕捉程序运行时的一些事件。如:载入共享库(动态链接库)或是C++的异常。设置捕捉点的格式为:

catch <event>

当event发生时,停住程序。event可以是下面的内容:

1、throw 一个C++抛出的异常。(throw为关键字)

2、catch 一个C++捕捉到的异常。(catch为关键字)

3、exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)

4、fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)

5、vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)

6、load 或 load <libname> 载入共享库(动态链接库)时。(load为关键字,目前只在HP-UX下有用)

7、unload 或unload <libname>卸载共享库(动态链接库)时。(unload为关键字,只在HP-UX下有用)

tcatch <event>
只设置一次捕捉点,当程序停住以后,应点被自动删除。
相关推荐
drinow9 小时前
【纸飞机串口调试工具】预设曲线名称
arm开发·驱动开发·单片机·mcu·dsp开发·fpga·iot
@haihi2 天前
什么是ARM
arm开发
@@庆2 天前
任务中断的两套API函数(改进FormISR的实时性)资源管理_互斥操作的本质(解决DH11经常出错的问题)
arm开发·stm32·单片机·嵌入式硬件·freertos
丁总学Java3 天前
ARM 架构(Advanced RISC Machine)精简指令集计算机(Reduced Instruction Set Computer)
arm开发·架构
韦德斯4 天前
嵌入式Linux的RTC读写操作应用
linux·运维·c语言·arm开发·实时音视频
byte轻骑兵4 天前
嵌入式 ARM Linux 系统构成全解:从硬件到应用层层剖析
linux·arm开发·arm·嵌入式开发
思尔芯S2C4 天前
面向未来的智能视觉参考设计与汽车架构,思尔芯提供基于Arm技术的创新方案
arm开发·架构·汽车·iot·fpga原型验证·prototyping·智慧视觉
Eternal-Student5 天前
【docker了解】如何将x86镜像转换为适用于Jetson的ARM镜像
arm开发·docker·容器
不怕犯错,就怕不做5 天前
修复kernel编译栈帧大小异常问题error: the frame size of 1928 bytes is larger than 1024 bytes
linux·arm开发·驱动开发
憧憬一下6 天前
UART硬件介绍
arm开发·嵌入式硬件·串口·嵌入式·linux驱动开发