综述:Panic Handler 与常用代码调试方法介绍
Panic Handler(紧急处理程序) 已在 ESP-IDF 编程指南 里详细描述,在此不做赘述。
常用的代码调试方法如下。
日志打印 / App Trace
ESP-IDF 中提供了便捷易用的日志打印库 ESP Logging 和 App trace(应用层跟踪库)。
Backtrace / Core Dump
此部分的详细指导请参考 使用 Backtrace & Coredump 定位问题。
GDB Stub through UART
请参考 GDB Stub,可简要总结为如下。
GDB Stub Postmortem
使能 CONFIG_ESP_SYSTEM_PANIC_GDBSTUB 在错误发生时,通过 UART esp_monitor 会自动进入 GDB
使用 ELF + Core dump 记录,通过 idf.py coredump-debug 进入 GDB
GDB 常用指令:
backtrace 追溯调用栈 (包含传入参数)
list 打印代码位置
info threads 打印所有 Task 信息
info locals 打印当前 Task 局部变量
print <var> 打印当前 Task 局部变量/全局变量
thread <id> 切换 Task
也可以进一步参考 GDB Cheat Sheet。
GDB Stub Debugging
使能 CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME, 在运行时可通过 UART esp_monitor 自动进入 GDB (Ctrl`+`C)
GDB 常用指令:
x/1xw <addr> 打印对应地址 32 bit 内存/寄存器
watch <var> 监视变量,当变量值发生变化时,GDB 会自动停下来
break <where> 设置断点,可以是函数名、行号、地址
continue 继续运行
step 单步运行,进入函数
next 单步运行,不进入函数
print <var> 打印变量值
set <var> = <value> 修改变量值
也可以进一步参考 GDB Cheat Sheet。
OpenOCD & GDB
请参考 JTAG Debugging。
GPIO tracing
GPIO tracing(GPIO 跟踪)往往通过翻转 IO 标识事件,比如在代码里自行实现出现某个事件时进行 GPIO 翻转,这样就能通过查询 GPIO 的翻转状态来判断事件是否触发。
SystemView through UART/JTAG
此部分的详细指导请参考 使用 SystemView 进行系统分析和调优。