文章目录
ESP32调试
启动调试
一. 环境搭建
二. 运行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 watch
或 info break
info watch
info break
3 添加监视断点表达式
命令:watch 表达式
不管表达式中的那个变量发生变化都会触发断点停下来
watch tmp_variable_1+tmp_variable_2
三. GDB 打印命令
输出
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
命令添加某个变量后可在程序触发任意断点停下来时打印当前变量的值,与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 单步或多步执行(不会进入函数内部)
单步
命令:next
或 n
多步
命令: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