欢迎光临散文网 会员登陆 & 注册

Core Dump:调试 ESP32 开发板上 Zephyr 程序错误的强大工具

2023-08-15 20:23 作者:乐鑫信息科技  | 我要投稿

Zephyr 是一个开源、可扩展、适应性强的实时操作系统 (RTOS),能够在多种硬件平台上运行,包括 乐鑫 的 ESP32、ESP32-S2、ESP32-C3 和 ESP32-S3 系列产品。Zephyr 为嵌入式系统开发提供了丰富的功能,包括针对无法恢复的软件错误生成可供分析的 core dump。 

Core dump 是在程序崩溃时保留的内存快照,可用于调试程序,查找崩溃原因、以及确定导致崩溃的具体任务、代码行和调用堆栈。如果需要,还可以为变量赋值并存储变量内容。 

Zephyr 操作系统支持多个 core dump 后端,其中包括日志后端。日志后端将 core dump 输出到 UART,然后保存到文件中,这样就可以使用自定义的 GDB 服务器和 SDK 提供的 GDB 进行分析。 


如何使用

要使用 core dump 的日志后端,需要启用相应的 Kconfig 选项: 

一旦启用了日志后端,应用程序在遇到致命错误时将生成 core dump。CPU 寄存器和内存内容将被打印到控制台。 

将内容复制并粘贴到一个名为 coredump.log 的文件中。 

我们需要将这个文本文件转换为自定义 GDB 服务器可以解析的二进制文件。只需运行 coredump_serial_log_parser.py 脚本即可。 

该脚本会把二进制文件输出到 coredump.bin。

使用 zephyr 应用程序中的 .elf 文件,并将 coredump.bin 作为参数,启动自定义的 GDB 服务器:

打开另一个终端, Zephyr SDK 里运行 Xtensa GDB,将 .elf 文件作为参数: 

GDB 内部,使用以下命令连接到自定义服务器: 

现在,您可以检查程序崩溃时的状态,读取变量值回溯信息和寄存器值 


示例 

下面是一个使用 core dump 进行调试的例子。 

我们在 tests/subsys/debug/coredump 里创建并烧录 core dump 示例。 

示例定义了三个函数:func_1func_2 func_3func_1 调用 func_2func_2 调用func_3func_3 试图对空指针进行解引用,这将导致程序崩溃。 

程序崩溃会生成一个 core dump 文件,我们将用它来调试程序 

1.创建应用程序:

 2.烧录并监控 ESP32 开发板:

预期输出: 

Coredump内容以#CD:BEGIN#开始,以#CD:END#结束。我们需要将这两者之间的内容复制到一个名为 coredump.log 的新文件中。

3.将 core dump 复制到 coredump.log:

4.转换为二进制格式:

5.启动自定义的 GDB 服务器:

预期输出:

6.打开一个新的终端,启动 Zephyr SDK 中的 Xtensa ESP32 GDB:

7.在 GDB 内部,连接到远程服务器:

8.运行 bt 命令查看回溯信息:


结论

Core dump 是一个强大的工具,用于调试 ESP32 开发板上的 Zephyr 程序错误。通过使用 core dump 的日志后端,您可以轻松生成 core dump 文件,并使用调试器进行分析。这将帮助您快速、方便地找出程序崩溃的原因,并修复 bug。


相关链接

  • Zephyr

    https://www.zephyrproject.org

  • 乐鑫

    https://www.espressif.com/zh-hans/home


Core Dump:调试 ESP32 开发板上 Zephyr 程序错误的强大工具的评论 (共 条)

分享到微博请遵守国家法律