ESP32 JTAG 调试

news2024/9/22 0:54:22

前言

  1. 个人邮箱:zhangyixu02@gmail.com
  2. 本人使用的是 Ubuntu 环境,采用 GDB 方式进行调试。
  3. 对于新手,我个人还是建议参考ESP32S3学习笔记(0)—— Vscode IDF环境搭建及OpenOCD调试介绍进行图形化的方式调试。
  4. 如果是希望在 Windows 环境下进行 GDB 调试,可以参考 Windows 环境下,使用 ESP32-S3 USB 接口进行 JTAG 调试的流程。

GDB 介绍

两种调试方式

  1. ESP32 提供了两种调试方式,一种是利用串口进行日志打印。这种方式是常用的,我们可以根据日志信息知道程序的运行信息。
  2. 但是在一些特殊场景,例如我需要让程序在某个时刻停下来进行调试,日志打印的方式就并不那么好用了。我们此时就可以使用 JTAG 调试的方式进行。

在这里插入图片描述

GDB 和 Openocd 介绍

  1. 电脑端,我们需要先运行 Openocd 充当调试代理用于与目标硬件进行直接通讯,他提供一个 GDB 服务器接口(通常在TCP端口 :3333 上),GDB 可以通过该接口与 OpenOCD 通信。 GDB 会向 OpenOCD 发送调试命令,例如设置断点、查看寄存器、单步执行等。当 OpenOCD 接收到来自 GDB 的命令后,负责将这些命令转换成特定的硬件指令,并执行到目标设备上
  2. GDB 是一个高层的调试器,用户通过它来编写和管理调试会话。GDB本身不直接与硬件通信,它通过GDB服务器(如OpenOCD提供的)与设备进行交互。
  3. 如下为 电脑端 <—> 调试器 <—> ESP32C3 的方式进行调试。调试器为 FT2232/FT232 芯片。

在这里插入图片描述

  1. 这种外置调试器的方法相对麻烦,还需要自行准备调试芯片,后面乐鑫将调试器集成到了芯片内部。

在这里插入图片描述

  1. 我们可以通过乐鑫官方选型网站得知哪些芯片内部集成了 JTAG 调试接口。

在这里插入图片描述

  1. 如果当前使用的芯片内部没有 JTAG 调试接口,我们可以购买 ESP-Prog 进行调试。

环境准备

打开 Openocd

  1. 通过上面的内容我们知道,要进行 GDB 调试 ESP32-S3 的话,需要先打开 Openocd 提供一个接口。我们可以输入如下命令进行开启 Openocd。
openocd -f board/esp32s3-builtin.cfg
  1. 这个 cfg 文件在如下目录中,我们可以在该目录中选择合适的文件打开 Openocd。

注:随着版本更新,你可能并不是 v0.12.0-esp32-20230921。

~/.espressif/tools/openocd-esp32/v0.12.0-esp32-20230921/openocd-esp32/share/openocd/scripts/board
  1. 这个时候肯定就会有人要说了,我怎么知道应该选择哪个 cfg 文件呢?
  • 如果是内部集成了 JTAG 接口,一般选择 builtin 名称的 cfg 文件。
  • 如果是使用的 ESP-Prog 调试器,那么就选择 bridge 名称的 cfg 文件。
  • 如果你发现上述做法都不对,那就找到对应的芯片前缀名,然后一个一个的试吧。(哭笑)
  1. 在 Ubuntu 环境中,你打开 Openocd 发现如下报错,那么说明当前用户没有足够的权限访问 USB 设备
Error: libusb_open() failed with LIBUSB_ERROR_ACCESS
Error: esp_usb_jtag: could not find or open device!
  1. 此时你需要创建一个 udev 规则文件添加规则。
sudo vim /etc/udev/rules.d/99-openocd.rules
  1. 添加如下内容。
SUBSYSTEM=="usb", ATTR{idVendor}=="303a", ATTR{idProduct}=="1001", MODE="0666"
  1. 重新加载 udev 规则。
sudo udevadm control --reload-rules
sudo udevadm trigger

进入 GDB 调试

  1. 我们需要在项目根目录中创建 gdbinit 文件,并且在该文件中加入如下内容。

tui enable 命令能够在终端中增加一个 UI 界面方便我们知道当前调试的位置,如果觉得这个 UI 界面看的不舒服,可以将这一行给删除

# 告诉 GDB 连接到运行在本地(即当前计算机)上的 OpenOCD 服务,监听端口 3333
target remote :3333
# 设置硬件观察点限制
set remote hardware-watchpoint-limit 2
# 重置并停止目标设备
mon reset halt
# 刷新寄存器状态
flushregs
# 在 app_main 函数处设置临时断点
thb app_main
# 继续执行程序
c
# 使能 UI 界面
tui enable
  1. 此时我们需要再打开一个终端,输入如下命令即可进入 GDB 调试界面。

注:当前 elf 文件应该是你烧录到芯片时,生成的 elf 文件! 调试过程中,工程代码建议不要修改。

xtensa-esp32s3-elf-gdb -x gdbinit build/gatt_client_demo.elf
  1. 不同的芯片/架构使用的 GDB 调试器不同,具体参考如下:
架构/芯片命令
Xtensa ESP32xtensa-esp32-elf-gdb
Xtensa ESP32-S2xtensa-esp32s2-elf-gdb
Xtensa ESP32-S3xtensa-esp32s3-elf-gdb
RISC-Vriscv32-esp-elf-gdb

GDB 命令

控制命令

运行命令

命令作用
continue/c运行程序,直到遇到断点才停止
next/n单步执行, 跳过函数调用
next/n count运行多步, 跳过函数调用(count 要跳过运行的步骤次数)
step/s单步调试,进入函数调用
step/s count多步调试,进入函数调用(count 要跳过运行的步骤次数)
finish继续执行,直到当前函数返回
until num运行到指定行号(num 行号)
jump/j num直接跳转到指定行数代码,相当于 C 语言的 goto 语句
monitor reset halt复位开发板

set 命令

命令作用
set 变量名=num将指定变量设置为指定值(num 数值)
set $变量名=num设置一个 GDB 的内部变量,此方法可以用于进行特定的调试计算。具体参考ESP32 JTAG Debug 14: GDB Set 命令的第 6 min
set print address off/on打印数据时,关闭/开启 打印对应数据地址
set style address foreground 设置内存地址的前景色(字体颜色)
set style address background 设置内存地址的背景色

信息查看命令

命令作用
list/l列出当前位置往下10列源代码
backtrace/bt查看函数调用信息
where查看当前程序运行到了哪里
info locals查看当前作用域的局部变量信息
info registers/reg显示所有寄存器的值
info registers/reg 显示指定寄存器的值

print 命令

命令作用
print 变量名/数组/字符串/结构体查看指定变量的值
print /x 变量名以 16 进制形式打印变量值
print /d 变量名以 10 进制形式打印变量值
print /u 变量名以无符号 10 进制形式打印变量值
print /o 变量名以 8 进制形式打印变量值
print /t 变量名以 2 进制形式打印变量值
print /a 变量名以地址格式打印变量值
print /c 变量名以字符形式打印变量值
print /f 变量名以浮点数形式打印变量值
print /s 变量名以字符串形式打印变量值
print 函数名 :: 变量名打印指定函数中,指定变量的数据
print ‘指定文件路径’ :: 变量打印不同文件中变量的信息
print pretty on启动 “漂亮打印”(pretty-printing)功能,这将允许 GDB 以更可读的格式输出复杂数据结构(如结构体、类、数组等),使得调试时的输出更加清晰易懂

display 命令

命令作用
display 变量名持续监视某个变量
display /x 变量名以 16 进制形式持续监视某个变量
info display查看 display 列表
disable display num失能 display 列表中指定监视
enable display num使能 display 列表中指定监视
undisplay num删除 display 列表中指定监视
delete display num删除 display 列表中指定监视

地址信息打印命令

格式 :

x/<count><format><size> <address>
  • <count>:要显示的内存单元的数量(可选,默认值为 1)。
  • <format>:指定输出格式,可以是以下之一:
    • x:十六进制(hexadecimal)
    • d:十进制(decimal)
    • u:无符号十进制(unsigned decimal)
    • o:八进制(octal)
    • t:二进制(binary)
    • c:字符(character)
    • f:浮点数(float)
    • s:字符串(string)
    • i:指令(instruction)
  • <size>:指定每个单元的大小,可以是以下之一:
    • b:字节(byte)
    • h:半字(halfword,2 bytes)
    • w:字(word,通常为 4 bytes)
    • g:巨字(giant word,通常为 8 bytes)
  • <address>:要查看的内存地址,可以是变量名、指针或具体的内存地址。

断点命令

添加断点

命令作用
break/b ngdb 运行到的当前文件中的某一行设置断点(n : 当前文件行号)
break/b filename: n向指定文件的指定行设置断点(filename : 指定)
break/b func在指定函数开头设置断点(func : 函数名)
tbreak n/func设置临时断点,在设置之后只起作用一次(n : 当前文件行号 func : 函数名)

断点控制

命令作用
disable n失能指定断点号断点 (n : 断点号)
enable n使能指定断点号断点 (n : 断点号)
delete/d删除所有断点
delete/d n删除指定断点号断点 (n : 断点号)
clear n清除行 n 上面的所有断点

查看断点信息

命令作用
info break/b查看所有断点信息
info break/b n查看指定断点号断点信息 (n : 断点号)

观察断点

命令作用
watch 变量名给指定变量名设置一个观察断点,所有与该变量名发生变化的地方进行打断,在运行到发生修改地方时,会停止并且打印该变量的原来值修改之后的值。在相同的地方,如果只有第一次该变量发生变化,那么该地方只有第一次会被打断
info watch查看观察断点相关信息
watch 表达式给一个表达式观察断点,例如表达式 i+j,如果变量 i 不发生变化,j 发生变化,依旧会在 j 发生变化的地方进行打断

其他命令

命令作用
shell clear调用 shell 清屏命令
quit/q退出 gdb 调试
define my_command自定义命令,能够进行自定义调试,具体用法参考ESP32 JTAG Debug 15: GDB Define 命令

TUI 使用

命令作用
上下左右箭头向上/下/左/右向滚动代码
PgUP/PgDn向上/下翻页
update回到当前运行的位置
list/l num查看指定行号信息(num 行号)
layout asm查看汇编代码
layout regs显示寄存器相关信息
layout src回到源代码

参考

  1. Windows 环境下,使用 ESP32-S3 USB 接口进行 JTAG 调试的流程
  2. B站:ESP32 JTAG Debug 01: JTAG接口简介
  3. 利用 Guru Meditation 错误打印定位问题
  4. GDB常用命令大全 GDB 命令详细解释
  5. gdb调试常见命令详细总结(附示例操作)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2153771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java反序列化利用链篇 | URLDNS链

文章目录 URLDNS链调用链分析Payload编写 系列篇其他文章&#xff0c;推荐顺序观看~ Java反序列化利用链篇 | JdbcRowSetImpl利用链分析Java反序列化利用链篇 | CC1链_全网最菜的分析思路Java反序列化利用链篇 | CC1链的第二种方式-LazyMap版调用链Java反序列化利用链篇 | URLD…

【2024华为杯数学建模研赛赛题已出(A-F题)】

华为杯2024年中国研究生数学建模竞赛A-F题已公布 A题 B题 C题 D题 E题 F题

国庆小长假让你双倍快乐感的好物分享!宅家出游都满意~

经过长时间的工作与学习&#xff0c;终于即将迎来期盼已久的国庆长假。我相信许多朋友已经迫不及待地开始规划假期了&#xff0c;无论是踏上归途还是外出旅行&#xff0c;音乐总能为我们的旅程增添无限乐趣&#xff0c;成为提升心情的绝佳选择。而耳机&#xff0c;则是连接这份…

深度学习的新突破:Difformer模型

人工智能咨询培训老师叶梓 转载标明出处 在现实世界中&#xff0c;数据之间的复杂相互依赖性是一个普遍存在的现象。这种错综复杂的依赖关系&#xff0c;对于传统的机器学习算法来说&#xff0c;是一个巨大的挑战。因为它们通常假设数据是独立同分布的&#xff0c;这使得算法难…

暴力枚举算法

《啊哈&#xff01;算法》学习笔记 本博客的题目仅用暴力枚举&#xff0c;并不一定是最好的解法&#xff0c;主要是了解枚举算法 例题一&#xff1a;两方框奥数 在两个方框内填入相同的数字使得等式成立&#xff1a; 代码如下&#xff1a; for(i1;i<9;i) {if((i*103)*652…

华为OD机试 - 水仙花数Ⅱ - 动态规划(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

【亿美软通-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

探索《藏汉翻译通》小程序:跨平台的藏文翻译利器

亲爱的读者们&#xff0c;当谈及藏文与汉语之间的翻译工具时&#xff0c;您可能已经对安卓平台的《藏汉翻译通》应用和iOS平台的《藏语翻译通》应用有所耳闻。今天&#xff0c;我们想要向您推荐一款既实用又便捷的新工具——《藏汉翻译通》小程序。 这款小程序不仅能够提供精确…

中国电子学会202312青少年软件编程(Python)等级考试试卷(三级)真题

2023年12月青少年软件编程Python等级考试(三级)真题试卷 题目总数:38 总分数:100 一、选择题 第 1 题 单选题 一个非零的二进制正整数,在其末尾添加两个“0”,则该新数将是原数的?( ) A.10倍 B.2倍 C.4倍 D.8倍 第 2 题 单选题 2023年亚运会将在杭…

使用开源 Whisper 视频转文字

Whisper 是 OpenAI 开源的语音到文字的模型&#xff0c; 支持多语言&#xff0c;Whisper 模型是基于 Transformer 架构&#xff0c;音频输入、文字输出&#xff0c;具体架构如下图。 Whisper 支持多种参数&#xff0c;模型的文档中说中等尺寸的模型不支持多语言&#xff0c;我测…

LED显示屏迎来革新:GOB封装技术引领行业新风尚

在我们日常生活中&#xff0c;LED显示屏无处不在&#xff0c;从繁华的街头广告牌到家庭娱乐中心的大屏幕电视&#xff0c;它们都以鲜明的色彩和清晰的画质吸引着我们的目光。然而&#xff0c;在LED显示屏技术日新月异的今天&#xff0c;一种名为GOB&#xff08;Glue On Board&a…

asp.net门诊管理系统网站(含协同过滤算法)VS开发sqlserver数据库web结构c#编程web网页设计

一、源码特点 asp.net门诊管理系统网站是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言 开发。 应用技术&#xff1a;asp.net c…

PAT甲级-1086 Tree Traversals Again

题目 题目大意 题目给出二叉树的节点个数&#xff0c;并给出用栈遍历树的过程。要求输出树的后序遍历&#xff0c;不能有多余空格。 思路 可以看出&#xff0c;栈遍历输出的是树的中序遍历&#xff0c;而依次push进栈的是先序遍历的顺序。题目要求后序&#xff0c;即已知先序…

为什么 ECB 模式不安全

我们先来简单了解下 ECB 模式是如何工作的 ECB 模式不涉及链接模式&#xff0c;所以也就用不着初始化向量&#xff0c;那么相同的明文分组就会被加密成相同的密文分组&#xff0c;而且每个分组运算都是独立的&#xff0c;这也就意味着可以并行提高运算效率&#xff0c;但也正是…

车载软件调试工具系列---Trace32断点功能

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

图形化编程012(变量-倒计时)

案例展示 点击绿旗&#xff0c;使用空格键控制鳐鱼&#xff0c;按下空格向上游&#xff0c;松开下落。 在舞台右侧会出现障碍物从右向左移动&#xff0c;移动到左侧边缘发出声音并隐藏。 鳐鱼碰到障碍停止全部脚本&#xff0c;坚持60秒程序结束。 一、逻辑思维 通过读题将大…

谷歌 Chrome 最新版升级:更强的安全检查功能守护你的上网安全

谷歌 Chrome 浏览器产品经理 Andrew Kamau 在最新发布的博文中宣布&#xff0c;Chrome 浏览器迎来了新一轮的安全升级。新版 Chrome 在后台自动运行安全检查功能&#xff0c;采取了额外的主动措施来保障用户的安全。 自动撤销通知权限 新版 Chrome 浏览器采用了一项基于谷歌安…

线程知识点补充

我们之前&#xff1a; 主线程下来&#xff0c;调用了一个方法run方法&#xff0c;方法执行完后再继续往下走主线程。 咱们期望&#xff1a; 两个同时执行&#xff0c;交替执行。 一些核心概念说明&#xff1a; 一个程序写好是静态的&#xff0c;给他运行起来就是一个进程了…

Linux(7)--目录文件的创建、删除、移动、复制、重命名

文章目录 1. 创建目录、文件2. 删除目录、文件3. 移动目录、文件4. 复制目录、文件5. 重命名目录、文件 1. 创建目录、文件 使用mkdir创建目录&#xff1a; 使用touch创建文件&#xff1a; 2. 删除目录、文件 使用rm可以删除文件: 使用rm -f可以强制删除文件&#xff0c;…

Nuxt Kit 中的插件:创建与使用

title: Nuxt Kit 中的插件:创建与使用 date: 2024/9/19 updated: 2024/9/19 author: cmdragon excerpt: 摘要:本文介绍了在 Nuxt 3 框架中使用 Nuxt Kit 创建和管理插件的方法,包括使用addPlugin注册插件、创建插件文件、在Vue组件中使用插件,以及使用addPluginTemplate…