综述:Panic Handler 与常用代码调试方法介绍

[English]

Panic Handler(紧急处理程序) 已在 ESP-IDF 编程指南 里详细描述,在此不做赘述。

常用的代码调试方法如下。

日志打印 / App Trace

ESP-IDF 中提供了便捷易用的日志打印库 ESP LoggingApp trace(应用层跟踪库)

Backtrace / Core Dump

此部分的详细指导请参考 使用 Backtrace & Coredump 定位问题

GDB Stub through UART

请参考 GDB Stub,可简要总结为如下。

GDB Stub Postmortem

  1. 使能 CONFIG_ESP_SYSTEM_PANIC_GDBSTUB 在错误发生时,通过 UART esp_monitor 会自动进入 GDB

  2. 使用 ELF + Core dump 记录,通过 idf.py coredump-debug 进入 GDB

GDB 常用指令:

  1. backtrace 追溯调用栈 (包含传入参数)

  2. list 打印代码位置

  3. info threads 打印所有 Task 信息

  4. info locals 打印当前 Task 局部变量

  5. print <var> 打印当前 Task 局部变量/全局变量

  6. thread <id> 切换 Task

也可以进一步参考 GDB Cheat Sheet

GDB Stub Debugging

  1. 使能 CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME, 在运行时可通过 UART esp_monitor 自动进入 GDB (Ctrl`+`C

GDB 常用指令:

  1. x/1xw <addr> 打印对应地址 32 bit 内存/寄存器

  2. watch <var> 监视变量,当变量值发生变化时,GDB 会自动停下来

  3. break <where> 设置断点,可以是函数名、行号、地址

  4. continue 继续运行

  5. step 单步运行,进入函数

  6. next 单步运行,不进入函数

  7. print <var> 打印变量值

  8. set <var> = <value> 修改变量值

也可以进一步参考 GDB Cheat Sheet

OpenOCD & GDB

请参考 JTAG Debugging

GPIO tracing

GPIO tracing(GPIO 跟踪)往往通过翻转 IO 标识事件,比如在代码里自行实现出现某个事件时进行 GPIO 翻转,这样就能通过查询 GPIO 的翻转状态来判断事件是否触发。

SystemView through UART/JTAG

此部分的详细指导请参考 使用 SystemView 进行系统分析和调优