四博智联产品售后

 找回密码
 立即注册
搜索
查看: 1095|回复: 0

ESP32如何使用coredump调试

[复制链接]

17

主题

19

帖子

129

积分

超级版主

Rank: 8Rank: 8

积分
129
发表于 2018-1-12 10:44:45 | 显示全部楼层 |阅读模式
写好应用程序后,经常遇到崩溃重启的现象,这时候可以使用esp-idf提供的coredump功能找bug。下面介绍如何使用coredump

首先,在你的工程的menuconfig中打开相关选项,在工程目录下执行“make coredump”,然后依次进入下面菜单:component config -> esp32-specific -> coredump destination,选择UART,表示将coredump输出到串口终端,如下图:
Screenshot from 2018-01-12 09-29-30.png

然后进入下面菜单component config -> esp32-specific -> Panic handler behaviour:选择print register and halt,如下图:
Screenshot from 2018-01-12 09-29-54.png

然后就可以编译下载到esp32运行你的程序,当出现bug导致crash的时候,esp32会停止运行并输出coredump信息到串口中断,下面是一个测试程序:
  1. /* Hello World Example

  2.    This example code is in the Public Domain (or CC0 licensed, at your option.)

  3.    Unless required by applicable law or agreed to in writing, this
  4.    software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  5.    CONDITIONS OF ANY KIND, either express or implied.
  6. */
  7. #include <stdio.h>
  8. #include "freertos/FreeRTOS.h"
  9. #include "freertos/task.h"
  10. #include "esp_system.h"
  11. #include "esp_spi_flash.h"

  12. typedef struct test_struct {
  13.     char over1;
  14.     char over2;
  15. } test_t;

  16. void app_main()
  17. {
  18.     printf("Hello world!\n");

  19.     /* Print chip information */
  20.     esp_chip_info_t chip_info;
  21.     esp_chip_info(&chip_info);
  22.     printf("This is ESP32 chip with %d CPU cores, WiFi%s%s, ",
  23.             chip_info.cores,
  24.             (chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
  25.             (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");

  26.     printf("silicon revision %d, ", chip_info.revision);

  27.     printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024),
  28.             (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");

  29.     test_t *pTest = NULL;
  30.     pTest->over1 = 5;

  31.     for (int i = 10; i >= 0; i--) {
  32.         printf("Restarting in %d seconds...\n", i);
  33.         vTaskDelay(1000 / portTICK_PERIOD_MS);
  34.     }
  35.     printf("Restarting now.\n");
  36.     fflush(stdout);
  37.     esp_restart();
  38. }
复制代码


测试程序38行对pTest这个空指针进行赋值操作,会造成crash。下载运行后可以看到串口输出下面coredump信息,这些信息显示是乱码,如下图,需要用espcoredump.py转换为可读内容。
QQ图片20180112100456.png

把所有乱码拷贝到一个文件里,例如另存为coredump.txt文件,coredump.txt可存放于工程目录下。乱码从CORE DUMP START开始一直到CORE DUMP END,这两行不用拷贝。

最后执行命令python $IDF_PATH/components/espcoredump/espcoredump.py info_corefile -t b64 -c coredump.txt build/hello-world.elf 可以生成可读的coredump信息。例如下面是生成的信息:
===============================================================
==================== ESP32 CORE DUMP START ====================

================== CURRENT THREAD REGISTERS ===================
pc             0x400d206f       0x400d206f <app_main+95>
lbeg           0x400014fd       1073747197
lend           0x4000150d       1073747213
lcount         0xfffffffd       4294967293
sar            0x14     20
ps             0x60220  393760
threadptr      <unavailable>
br             <unavailable>
scompare1      <unavailable>
acclo          <unavailable>
acchi          <unavailable>
m0             <unavailable>
m1             <unavailable>
m2             <unavailable>
m3             <unavailable>
expstate       <unavailable>
f64r_lo        <unavailable>
f64r_hi        <unavailable>
f64s           <unavailable>
fcr            <unavailable>
fsr            <unavailable>
a0             0x400d0829       1074595881
a1             0x3ffb49f0       1073433072
a2             0x0      0
a3             0x1      1
a4             0x1      1
a5             0x3ffb4ab4       1073433268
a6             0x0      0
a7             0x1      1
a8             0x5      5
a9             0x3ffb49a0       1073432992
a10            0x13     19
a11            0x3ffb4b1c       1073433372
a12            0x3f402c50       1061170256
a13            0x3f402c3c       1061170236
a14            0x3ffaffec       1073414124
a15            0x0      0

==================== CURRENT THREAD STACK =====================
#0  0x400d206f in app_main () at /home/nicholas/Sources/test/hello_world/main/./hello_world_main.c:38
#1  0x400d0829 in main_task (args=0x0) at /home/nicholas/Sources/Github/LuaNode/LuaNode_Esp32/esp-idf/components/esp32/./cpu_start.c:449

======================== THREADS INFO =========================
  Id   Target Id         Frame
  8    process 7         0x40084611 in xQueueGenericReceive (xQueue=0x3ffafd18, pvBuffer=0x0, xTicksToWait=4294967295, xJustPeeking=0) at /home/nicholas/Sources/Github/LuaNode/LuaNode_Esp32/esp-idf/components/freertos/./queue.c:1591
  7    process 6         0x40081096 in esp_crosscore_int_send_yield (core_id=1) at /home/nicholas/Sources/Github/LuaNode/LuaNode_Esp32/esp-idf/  mponents/esp32/./crosscore_int.c:112
▽ 6    process 5         0x40084611 in xQueueGenericReceive (xQueue=0x3ffaea14, pvBuffer=0x0, xTicksToWait=4294967295, xJustPeeking=0) at /home/nicholas/Sources/Github/LuaNode/LuaNode_Esp32/esp-idf/components/freertos/./queue.c:1591
  5    process 4         0x4008528a in vTaskDelete (xTaskToDelete=<optimized out>) at /home/nicholas/Sources/Github/LuaNode/LuaNode_Esp32/esp-idf/components/freertos/./tasks.c:1316
  4    process 3         0x40085ec4 in prvProcessTimerOrBlockTask (xNextExpireTime=<optimized out>, xListWasEmpty=<optimized out>) at /home/nicholas/Sources/Github/LuaNode/LuaNode_Esp32/esp-idf/components/freertos/./timers.c:588
  3    process 2         prvIdleTask (pvParameters=0x0) at /home/nicholas/Sources/Github/LuaNode/LuaNode_Esp32/esp-idf/components/freertos/./tasks.c:3353
  2    process 1         prvIdleTask (pvParameters=0x0) at /home/nicholas/Sources/Github/LuaNode/LuaNode_Esp32/esp-idf/components/freertos/./tasks.c:3353
* 1    <main task>       0x400d206f in app_main () at /home/nicholas/Sources/test/hello_world/main/./hello_world_main.c:38

======================= ALL MEMORY REGIONS ========================
Name   Address   Size   Attrs
.rtc.text 0x400c0000 0x0 RW  
.iram0.vectors 0x40080000 0x400 R XA
.iram0.text 0x40080400 0x8b08 R XA
.dram0.data 0x3ffb0000 0x24ac RW A
.flash.rodata 0x3f400020 0x5254 RW A
.flash.text 0x400d0018 0x1334c R XA
.coredump.tasks 0x3ffb4ab4 0x164 RW
.coredump.tasks 0x3ffb4930 0x17c RW
.coredump.tasks 0x3ffb5610 0x164 RW
.coredump.tasks 0x3ffb54e0 0x128 RW
.coredump.tasks 0x3ffb50a4 0x164 RW
.coredump.tasks 0x3ffb4f70 0x12c RW
.coredump.tasks 0x3ffb6070 0x164 RW
.coredump.tasks 0x3ffb5ee0 0x188 RW
.coredump.tasks 0x3ffb3948 0x164 RW
.coredump.tasks 0x3ffb37e0 0x160 RW
.coredump.tasks 0x3ffafa6c 0x164 RW
.coredump.tasks 0x3ffaf8e0 0x184 RW
.coredump.tasks 0x3ffb34dc 0x164 RW
.coredump.tasks 0x3ffb3330 0x1a4 RW
.coredump.tasks 0x3ffafd6c 0x164 RW
.coredump.tasks 0x3ffb2f50 0x180 RW

===================== ESP32 CORE DUMP END =====================
===============================================================


从上面的信息中我们可以看到这样一行:
#0 0x400d206f in app_main () at /home/nicholas/Sources/test/hello_world/main/./hello_world_main.c:38
这说明crash是由于main文件38行导致的,这行对应代码中的:pTest->over1 = 5; 这正好是空指针操作的代码。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|四博智联 Inc. ( 粤ICP备15034758号-1

GMT+8, 2018-4-26 03:56 , Processed in 0.068540 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表