【ESP32调试-快速入门】

ESP32调试

在这里插入图片描述


启动调试


一. 环境搭建

ESP_IDF环境搭建


二. 运行OpenOCD

1. 烧入blink

如:安装环境中的examples中的blink
路劲:安装环境路劲下Espressif\frameworks\esp-idf-v4.4.3\examples\get-started\blink
①:运行ESP-IDF切换至blink目录下
命令:cd 路劲
在这里插入图片描述
②:选择芯片型号
命令:idfpy set-target 型号
在这里插入图片描述
③:设置blink GPIO
以GIPIO10为例:
1、进入menuconfig
命令:idf.py menuconfig
在这里插入图片描述
2、进入Example Configuration
在这里插入图片描述
3、设置Blink GPIO number
选择Blink GPIO number后回车输入10确认后,按S保存,Q退出
在这里插入图片描述
④:编译所有
命令:idf.py all
在这里插入图片描述

⑤:下载程序
命令:idf.py flash
在这里插入图片描述
⑥:重启mcu

2. 找到芯片型号对应的脚本文件,并运行脚本命令

①:查看脚本文件
路劲:安装环境路劲下Espressif\tools\openocd-esp32\v0.11.0-esp32-20220706\openocd-esp32\share\openocd\scripts\board
在这里插入图片描述
②:进入对应型号脚本可查看运行命令
如:esp32c3-builting.cfg

在这里插入图片描述
③: 输入脚本命令,运行OpenOCD
openocd -f board/esp32c3-builtin.cfg
在这里插入图片描述
OpenOCD运行成功,等待GDB连接,另起一个ESP-IDF运行GDB

三. 运行GDB

①:在blink目录下建立gdbinit文件
注:gdbinit文件没有后缀
在这里插入图片描述
②:编写gdbinit文件,输入一下内容

set remotetimeout 100
target extended-remote :3333
set remote hardware-watchpoint-limit 2
mon reset halt
flushregs
thb app_main
c

③:输入命令,运行GDB
命令:riscv32-esp-elf-gdb build/blink.elf -x gdbinit
在这里插入图片描述
在这里插入图片描述
运行成功



调试技巧


一. 设置断点

1 添加断点

命令:break 行号

break 78

在这里插入图片描述

2 查看所有断点、指定断点

命令:info break
命令:info break 断点号

info break

info break 78

注:按c回车,程序继续运行

3 禁止断点

命令:disable 断点号

disable 78
4 使能断点

命令:enable 断点号

enable 78
5 删除所有断点、指定断点

命令:delete
命令:delete 断点号

delete

delete 78
6 设置指定文件行号的断点

命令:break 文件名:行

break blink_example_main.c:78
7 设置函数名断点

命令:break 函数名

break blink_led

注:触发时会停留在函数的第一行

8 只运行一次断点

命令:tbreak 行号
命令:tbreak 函数名

tbreak 78

tbreak blink_led

注:此断点一次后会自动删除此断点


二. GDB监视断点

与普通断点不同的是,普通断点是添加断点的位置,比如某个.c文件的第n行,而GDB监视断点是添加某个变量至断点,在程序运行到添加断变量的值发生变化时停下来,并打印原来的值与变化后的值

1 添加监视断点变量

命令:watch 变量

watch tmp_variable
2 查看添加的断点变量

命令:info watchinfo break

info watch
info break
3 添加监视断点表达式

命令:watch 表达式
不管表达式中的那个变量发生变化都会触发断点停下来

watch tmp_variable_1+tmp_variable_2

三. GDB 打印命令

输出 print 命令打印某个变量的值

1 打印整数

命令:print 变量

print tmp_variable
2 打印不同格式的整数

命令:print /格式 变量

print /x tmp_variable
  • x 十六进制
  • d 有符号十进制
  • u 无符号十进制
  • o 八进制
  • t 二进制(t stands for two)
  • a 地址
  • c 字符
  • f 浮点数
  • s 字符串
3 打印数组

命令:print 数组名

print tmp_arr
4 打印字符串

命令:print 字符串

print tmp_str

可设置打印字符串时字符串的地址显示或关闭 set print address on/off

5 打印结构体

命令:print 结构体

print tmp_str

可设置打印结构体时结构体的地址显示或关闭 set print address on/off
可设置打印结构体的显示形式 set print pretty on/off

6 打印不同函数、不同文件中的变量

打印某个函数中变量的值
命令:print 函数名::变量

print tmp_fuc::tmp_value

打印某个文件中变量的值
命令:print '路劲'::变量

print 'E:\ESP32\ESP32_tools\Espressif\frameworks\esp-idf-v4.4.3\examples\get-started\blink\main\blink_example_main.c'::tmp_variable
7 强制设置变量的值

命令:print 变量名=值

print tmp_variable=5

四. GDB 显示某个变量的值

display 命令添加某个变量后可在程序触发任意断点停下来时打印当前变量的值,与 print 命令相比,display 不需要每次输入命令去获取变量当前的值,可打印出多个变量的值

1 添加显示的变量

命令:display 变量

display tmp_variable
2 显示已添加显示的变量

命令:info display

info display
3 删除已添加显示的某个变量或所有

命令:delete display n

delete display 1

命令:delete display

delete display

五. GDB 打印指定地址上的信息

命令:x /nfu 地址

n:打印多少个单位
f:打印格式

  • x 十六进制
  • d 有符号十进制
  • u 无符号十进制
  • o 八进制
  • t 二进制(t stands for two)
  • a 地址
  • c 字符
  • f 浮点数
  • s 字符串

u:单位

  • b:一个字节
  • h:二个字节
  • w:四个字节
  • g:八个字节
x /1sb 0x3c024928

六. GDB 单步调试

1 单步或多步执行(不会进入函数内部)

单步
命令:nextn
多步
命令:next n

next 3
2 单步或多步执行(会进入函数内部)

单步
命令:step
多步
命令:step n

step3

注:如果进入函数内部,想跳出子函数输入finish

3 运行到指定行

命令:until 行号

until 10

七. GDB 用户调试界面(TUI)

1 启动、退出TUI

方法一
启动TUI
命令:tui enable
退出TUI
命令:tui disable

方法二
修改启动文件 gdbinit
添加 tui enable

set remotetimeout 100
target extended-remote :3333
set remote hardware-watchpoint-limit 2
mon reset halt
flushregs
thb app_main
c
tui enable

2 显示目前程序运行位置

命令:update

3 显示本文件指定行

命令:list 行号

4 显示汇编代码

命令:layout asm

5 显示寄存器

命令:layout regs

6 显示源代码

命令:layout src


八. GDB 跳转

1 忽略一些代码(往后跳转)

从当前代码跳转到后面指定行,中间的代码被忽略,不会被运行,直接从指定行开始运行
命令:jump 行号

2 重复一些代码(往前跳转)

从当前代码跳转到前面指定行,返回去从指定行开始继续运行
命令:jump 行号

3 强行运行一些分支代码

在某些情况下,一些分支代码是不会得以运行的,这个时候可以用jump强行跳转过去运行
命令:jump 行号


九. GDB Set Command

1 设置代码变量的值

命令:set var 变量=值

set var i=10
2 设置环境变量的值

命令:set $变量=值

set $a=3;

例:k[5]={0,1,2,3,4};

set $a=0
while($a < 5)
if(k[$a] == 3)
printf "$a = %d, find 3.\n",$a
end
set $a = $a + 1
end

打印输出
$a = 3, find 3.

十. GDB Define Command

自定义命令
命令:

define 自定义命令名(按下enter键)
需要执行的命令
end

例:输入my_print可打印出i、j、f

define my_print
print i
print j
print f
end
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eiker_3169

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值