一般来说接触ESP32的backtrace功能基本都是在固件跑崩的情况下.ESP-IDF自己打印崩溃瞬间的调用堆栈以及寄存器值来分析问题用的.操作方法是先在cmd中进入到工程编译出的.elf的文件目录,然后再使用addr2line命令,将backtrace打印出的地址转换成对应代码所在的文件与行位置.例如这样:

addr2line -e uart_echo.elf -a -f 0x40240894:0x3fffd5800 x40240760:0x3fffd5c0 0x4023ec61:0x3fffd6a0 0x4023f415:0x3fffd6e0 0x400d1d04:0x3fffd8c0 0x4009197d:0x3fffd8e0

但是有时候,固件在正常运行,但是就有查看某一时刻的调用堆栈的需求,这个时候就需要手动让他打印backtrace来给我们分析调用堆栈.对应的函数是esp-idf\components\xtensa\debug_helpers.c里的esp_backtrace_print().

函数的解释是这样的:

/**
 * @brief Print the backtrace of the current stack
 *
 * @param depth The maximum number of stack frames to print (should be > 0)
 *
 * @return
 *      - ESP_OK    Backtrace successfully printed to completion or to depth limit
 *      - ESP_FAIL  Backtrace is corrupted
 */
esp_err_t esp_backtrace_print(int depth);

在需要查看调用堆栈的地方调用这个函数,例如这样:

在运行到这个地方时,就会打印出当时的调用堆栈,串口log上是这样的.