码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【ESP32调试-快速入门】


    文章目录

    • ESP32调试
      • 启动调试
        • 一. 环境搭建
        • 二. 运行OpenOCD
          • 1. 烧入blink
          • 2. 找到芯片型号对应的脚本文件,并运行脚本命令
        • 三. 运行GDB
      • 调试技巧
        • 一. 设置断点
          • 1 添加断点
          • 2 查看所有断点、指定断点
          • 3 禁止断点
          • 4 使能断点
          • 5 删除所有断点、指定断点
          • 6 设置指定文件行号的断点
          • 7 设置函数名断点
          • 8 只运行一次断点
        • 二. GDB监视断点
          • 1 添加监视断点变量
          • 2 查看添加的断点变量
          • 3 添加监视断点表达式
        • 三. GDB 打印命令
          • 1 打印整数
          • 2 打印不同格式的整数
          • 3 打印数组
          • 4 打印字符串
          • 5 打印结构体
          • 6 打印不同函数、不同文件中的变量
          • 7 强制设置变量的值
        • 四. GDB 显示某个变量的值
          • 1 添加显示的变量
          • 2 显示已添加显示的变量
          • 3 删除已添加显示的某个变量或所有
        • 五. GDB 打印指定地址上的信息
        • 六. GDB 单步调试
          • 1 单步或多步执行(不会进入函数内部)
          • 2 单步或多步执行(会进入函数内部)
          • 3 运行到指定行
        • 七. GDB 用户调试界面(TUI)
          • 1 启动、退出TUI
          • 2 显示目前程序运行位置
          • 3 显示本文件指定行
          • 4 显示汇编代码
          • 5 显示寄存器
          • 6 显示源代码
        • 八. GDB 跳转
          • 1 忽略一些代码(往后跳转)
          • 2 重复一些代码(往前跳转)
          • 3 强行运行一些分支代码
        • 九. GDB Set Command
          • 1 设置代码变量的值
          • 2 设置环境变量的值
        • 十. GDB Define Command

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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



    调试技巧


    一. 设置断点

    1 添加断点

    命令:break 行号

    break 78
    
    • 1

    在这里插入图片描述

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

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

    info break
    
    info break 78
    
    • 1
    • 2
    • 3

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

    3 禁止断点

    命令:disable 断点号

    disable 78
    
    • 1
    4 使能断点

    命令:enable 断点号

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

    命令:delete
    命令:delete 断点号

    delete
    
    delete 78
    
    • 1
    • 2
    • 3
    6 设置指定文件行号的断点

    命令:break 文件名:行

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

    命令:break 函数名

    break blink_led
    
    • 1

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

    8 只运行一次断点

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

    tbreak 78
    
    tbreak blink_led
    
    • 1
    • 2
    • 3

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


    二. GDB监视断点

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

    1 添加监视断点变量

    命令:watch 变量

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

    命令:info watch 或 info break

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

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

    watch tmp_variable_1+tmp_variable_2
    
    • 1

    三. GDB 打印命令

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

    1 打印整数

    命令:print 变量

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

    命令:print /格式 变量

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

    命令:print 数组名

    print tmp_arr
    
    • 1
    4 打印字符串

    命令:print 字符串

    print tmp_str
    
    • 1

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

    5 打印结构体

    命令:print 结构体

    print tmp_str
    
    • 1

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

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

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

    print tmp_fuc::tmp_value
    
    • 1

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

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

    命令:print 变量名=值

    print tmp_variable=5
    
    • 1

    四. GDB 显示某个变量的值

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

    1 添加显示的变量

    命令:display 变量

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

    命令:info display

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

    命令:delete display n

    delete display 1
    
    • 1

    命令:delete display

    delete display
    
    • 1

    五. 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
    
    • 1

    六. GDB 单步调试

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

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

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

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

    step3
    
    • 1

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

    3 运行到指定行

    命令:until 行号

    until 10
    
    • 1

    七. 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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
    
    • 1
    2 设置环境变量的值

    命令:set $变量=值

    set $a=3;
    
    • 1

    例: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.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    十. GDB Define Command

    自定义命令
    命令:

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

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

    define my_print
    print i
    print j
    print f
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    亚马逊云科技顾凡解读云计算助力初创快速抢滩生成式AI新风口
    【题解】同济线代习题一.8.2
    用队列实现栈-力扣
    计算机毕业设计选题推荐-高校后勤报修微信小程序/安卓APP-项目实战
    JUC源码学习笔记5——线程池,FutureTask,Executor框架源码解析
    基于LVM和NFS的cinder多后端
    打工人都觉得香的 Java 程序员 306 道面试秘笈
    Uniapp零基础开发学习笔记(10) -地图组件的使用
    svn log 高级命令解释
    【漏洞复现】Apache_Shiro_1.2.4_反序列化漏洞(CVE-2016-4437)
  • 原文地址:https://blog.csdn.net/K3169/article/details/128211844
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号