Core Dump:调试 ESP32 开发板上 Zephyr 程序错误的强大工具
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 寄存器和内存内容将被打印到控制台。
将内容复制并粘贴到一个名为 的文件中。
我们需要将这个文本文件转换为自定义 GDB 服务器可以解析的二进制文件。只需运行 coredump_serial_log_ 脚本即可。
该脚本会把二进制文件输出到 。
使用 zephyr 应用程序中的 .elf 文件,并将 作为参数,启动自定义的 GDB 服务器:
打开另一个终端,从 Zephyr SDK 里运行 Xtensa 的 GDB,将 .elf 文件作为参数:
在 GDB 内部,使用以下命令连接到自定义服务器:
现在,您可以检查程序崩溃时的状态,读取变量值、回溯信息和寄存器值了。
示例
下面是一个使用 core dump 进行调试的例子。
我们在 tests/subsys/debug/coredump 里创建并烧录 core dump 示例。
该示例定义了三个函数:func_1,func_2 和 func_3。func_1 调用 func_2,func_2 调用func_3。func_3 试图对空指针进行解引用,这将导致程序崩溃。
程序崩溃会生成一个 core dump 文件,我们将用它来调试程序。
1.创建应用程序:
2.烧录并监控 ESP32 开发板:
预期输出:
Coredump内容以#CD:BEGIN#开始,以#CD:END#结束。我们需要将这两者之间的内容复制到一个名为 的新文件中。
3.将 core dump 复制到 :
4.转换为二进制格式:
5.启动自定义的 GDB 服务器:
预期输出:
6.打开一个新的终端,启动 Zephyr SDK 中的 Xtensa ESP32 GDB:
7.在 GDB 内部,连接到远程服务器:
8.运行 bt 命令查看回溯信息:
结论
Core dump 是一个强大的工具,用于调试 ESP32 开发板上的 Zephyr 程序错误。通过使用 core dump 的日志后端,您可以轻松生成 core dump 文件,并使用调试器进行分析。这将帮助您快速、方便地找出程序崩溃的原因,并修复 bug。
相关链接
Zephyr
乐鑫
/zh-hans/home