> For the complete documentation index, see [llms.txt](https://libooogo.gitbook.io/esplane/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://libooogo.gitbook.io/esplane/esp32-development-notes/04esp32-dai-ma-tiao-shi-ji-zhong-tiao-shi-fang-fa-zong-jie.md).

# 04 ESP32-Code Debugging-Summary Of Several Debugging Methods

*\** 工欲善其事,必先利其器.

**一. JTAG** **二. 日志系统** **三. Core Dump**

## 一、JTAG调试

这里先介绍第一种调试方法-JTAG调试,JTAG是从STM32转过来的开发者的第一反应,这里放在最前面介绍.但是对于双核多任务的ESP32应用程序,并非最优的调试方法.

### 1. 官方文档

关于调试环境的搭建,参考乐鑫官方文档即可,有中文版详细配置过程:

* [Eclipse调试环境搭建](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/api-guides/jtag-debugging/using-debugger.html)
* [JTAG 调试](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/api-guides/jtag-debugging/index.html)
* [调试范例](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/api-guides/jtag-debugging/index.html#jtag-debugging-examples)

### 2. 硬件准备

#### 2.1 ESP32 WROVER KIT

ESP-WROVER-KIT板载了JTAG功能(FT2232),但是需要连接4个跳线帽接通线路,如下图:

![使能ESP32 JTAG](https://img-blog.csdnimg.cn/20190725111947186.jpg)

FT2232 是多协议 USB 转串口桥接器.在这里替换了cp2102,并且可以同时提供 USB-to-JTAG ,USB-to-Serial 接口功能,便利开发人员的应用开发与调试.具体配置信息可以查阅 [ESP-WROVER-KIT V4.1 入门指南](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/hw-reference/get-started-wrover-kit.html#esp-wrover-kit-v4-1)

#### 2.2. ESP32 Core Board V2

**ESP32 Core Board V2** 没有JTAG插口,如果需要硬件调试,需要准备:

1. [JTAG 适配器与杜邦线](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/api-guides/jtag-debugging/index.html#jtag-debugging-selecting-jtag-adapter)
2. [OpenOCD 软件包](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/api-guides/jtag-debugging/index.html#jtag-debugging-setup-openocd)
3. [ ESP32 目标板](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/api-guides/jtag-debugging/index.html#jtag-debugging-configuring-esp32-target)

按照如下方式连接:

```
|   | ESP32 引脚    | JTAG 信号 |
| 1 | CHIP_PU       | TRST_N    |
| 2 | MTDO / GPIO15 | TDO       |
| 3 | MTDI / GPIO12 | TDI       |
| 4 | MTCK / GPIO13 | TCK       |
| 5 | MTMS / GPIO14 | TMS       |
| 6 | GND           | GND       |
```

ESP32 使用标准的 JTAG 接口,支持STM32常用的J-Link,[如何使用 J-Link 调试 ESP32](https://wiki.ai-thinker.com/esp32/docs/esp32_openocd),但是不支持ST-Link,也不支持SWD接口:

> 官方描述: 在软件方面,OpenOCD 支持相当多数量的 JTAG 适配器,可以参阅 OpenOCD 支持的[适配器列表 ](http://openocd.org/doc/html/Debug-Adapter-Hardware.html)(尽管上面显示的器件不太完整),这个页面还列出了兼容 SWD 接口的适配器,但是请注意,ESP32 目前并不支持 SWD.此外那些被硬编码为只支持特定产品线的 JTAG 适配器也不能在 ESP32 上工作,比如用于 STM32 产品家族的 ST-LINK 适配器.

### 3. JTAG调试笔记

![JTAGt调试](https://img-blog.csdnimg.cn/20190725113604303.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIwNTE1NDYx,size_16,color_FFFFFF,t_70)

#### 3.1. 开启openOCD

```
cd ~/esp/openocd-esp32      
bin/openocd -s share/openocd/scripts -f interface/ftdi/esp32_devkitj_v1.cfg -f board/esp-wroom-32.cfg  #在openocd安装目录执行,开启openOCD server
```

#### 3.2. 运行xtensa-esp32-elf-gdb

```
cd ~/esp/esp-idf-v3.2.2/examples/get-started/blink
xtensa-esp32-elf-gdb -x gdbinit build/blink.elf  #在工程目录执行,连接openOCD
```

#### 3.3. 输入gdb命令,进行调试

* 断点设置:

  ```
  break N:在第N行设置断点
  delete N:删除第N行的断点
  info break:查看已设置的断点
  ```
* 调试运行

  ```
  s(或step):单步调试,可以跳入函数内部
  n(或next):单步调试,不跳入函数内部
  c:Continue,继续运行,到断点处停止
  Ctrl+C:随机停止
  q:结束会话
  ```
* 查看、修改内存

  ```
  x /1wx 0x3FF44004 #查看0x3FF44004内存位置内容
  0x3ff44004: 0x00000000
  set {unsigned int}0x3FF44004=0x000010 #设置0x3FF44004内存位置内容
  ```
* 查看代码

  \`\`\`

  i threads:查看当前所有线程

  thread N:查看编号N线程的代码

  bt(或backtrace):查看上一层,查看当前函数调用处(仅查看,未跳出)

  l:打印停止点处代码

  l 30, 40:打印第30-40行代码

```
* 查看帮助
```

help xxx:查看指令xxx的帮助

```
具体可以查看:[使用命令行的调试示例](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/api-guides/jtag-debugging/debugging-examples.html#jtag-debugging-examples-command-line)
***

## 二、日志系统

* 
* 
***

## 三、Core Dump

* 
* 


***

## 四、其他讨论

### 附1:通过gdb命令点亮LED灯

ESP32 WROVER KIT 自带RGB指示灯,分别接入了IO0、IO2、IO4,注意IO0、IO2的特殊作用.

| ESP32管脚 | RGB LED |
|:--------:|-----:|
| GPIO0 | 红色|
| GPIO2 | 绿色|
| GPIO4 | 蓝色|

*  查找到GPIO 0-31 output register的地址0x3FF44004
该寄存器可以用来控制(设置或者清除)某个 GPIO 的电平
![寄存器列表](https://img-blog.csdnimg.cn/2019072519594793.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIwNTE1NDYx,size_16,color_FFFFFF,t_70)
查询当前寄存器值:
```

(gdb) x /1wx 0x3FF44004 0x3ff44004: 0x00000000 #返回0x00000000

```
设置GPIO2对应的寄存器标志位为1,点亮LED:
```

(gdb) set {unsigned int}0x3FF44004=0x00000004

```
==遗留问题:== 只有写入0x00000004(对应IO2)才能正常点亮,IO0、IO4直接写GPIO_OUT_REG(GPIO 0-31 output register: 0x3FF44004 ),无法实现灯的操作.怀疑受到其他寄存器钳制.




***

### 附2: openOCD与xtensa-esp32-elf-gdb关系？


==无论先使用命令行还是eclipse调试,都需要先打开openOCD,关系图如下:==
```

cd \~/esp/openocd-esp32 bin/openocd -s share/openocd/scripts -f interface/ftdi/esp32\_devkitj\_v1.cfg -f board/esp-wroom-32.cfg

\`\`\`

![1545202874386](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9kb2NzLmVzcHJlc3NpZi5jb20vcHJvamVjdHMvZXNwLWlkZi9lbi9sYXRlc3QvX2ltYWdlcy9qdGFnLWRlYnVnZ2luZy1vdmVydmlldy5qcGc)

* OpenOCD:
  * 创建一个Server接收 gdb debugger 的连接请求
  * 通过JTAG适配器与ESP32 交互,控制设备运行状态
* xtensa-esp32-elf-gdb debugger:
  * 作为一个client,连接OpenOCD
  * 与用户交互,接收用户的 debug 命令(s\n等指令),发送到OpenOCD
* eclipse

  -图形化方式调用xtensa-esp32-elf-gdb debugger,包装命令行

> - [openOCD是硬件层次的调试,gdb是源码层次的调试.](https://blog.csdn.net/swyang1992/article/details/53495256)
> - 在gdb中可以使用monitor发送openOCD的命令,例如monitor reset;halt
