
如:安装环境中的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
①:查看脚本文件
路劲:安装环境路劲下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
①:在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


运行成功
命令:break 行号
break 78

命令:info break
命令:info break 断点号
info break
info break 78
注:按c回车,程序继续运行
命令:disable 断点号
disable 78
命令:enable 断点号
enable 78
命令:delete
命令:delete 断点号
delete
delete 78
命令:break 文件名:行
break blink_example_main.c:78
命令:break 函数名
break blink_led
注:触发时会停留在函数的第一行
命令:tbreak 行号
命令:tbreak 函数名
tbreak 78
tbreak blink_led
注:此断点一次后会自动删除此断点
与普通断点不同的是,普通断点是添加断点的位置,比如某个.c文件的第n行,而GDB监视断点是添加某个变量至断点,在程序运行到添加断变量的值发生变化时停下来,并打印原来的值与变化后的值
命令:watch 变量
watch tmp_variable
命令:info watch 或 info break
info watch
info break
命令:watch 表达式
不管表达式中的那个变量发生变化都会触发断点停下来
watch tmp_variable_1+tmp_variable_2
输出
命令:print 变量
print tmp_variable
命令:print /格式 变量
print /x tmp_variable
- x 十六进制
- d 有符号十进制
- u 无符号十进制
- o 八进制
- t 二进制(t stands for two)
- a 地址
- c 字符
- f 浮点数
- s 字符串
命令:print 数组名
print tmp_arr
命令:print 字符串
print tmp_str
可设置打印字符串时字符串的地址显示或关闭 set print address on/off
命令:print 结构体
print tmp_str
可设置打印结构体时结构体的地址显示或关闭 set print address on/off
可设置打印结构体的显示形式 set print pretty on/off
打印某个函数中变量的值
命令: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
命令:print 变量名=值
print tmp_variable=5
用
display命令添加某个变量后可在程序触发任意断点停下来时打印当前变量的值,与display不需要每次输入命令去获取变量当前的值,可打印出多个变量的值
命令:display 变量
display tmp_variable
命令:info display
info display
命令:delete display n
delete display 1
命令:delete display
delete display
命令: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
单步
命令:next 或 n
多步
命令:next n
next 3
单步
命令:step
多步
命令:step n
step3
注:如果进入函数内部,想跳出子函数输入finish
命令:until 行号
until 10
方法一
启动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
命令:update
命令:list 行号
命令:layout asm
命令:layout regs
命令:layout src
从当前代码跳转到后面指定行,中间的代码被忽略,不会被运行,直接从指定行开始运行
命令:jump 行号
从当前代码跳转到前面指定行,返回去从指定行开始继续运行
命令:jump 行号
在某些情况下,一些分支代码是不会得以运行的,这个时候可以用jump强行跳转过去运行
命令:jump 行号
命令:set var 变量=值
set var i=10
命令: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.
自定义命令
命令:
define 自定义命令名(按下enter键)
需要执行的命令
end
例:输入my_print可打印出i、j、f
define my_print
print i
print j
print f
end