目前的位置: 首页 学术信息 正文

ZDS 2023技术报告分享第33篇:把coredumps添加进Zephyr调试工具包


前言

2023年Zephyr开发者大会(ZDS)于6月27日至30日在捷克布拉格隆重举行。与以往两次不同,本次ZDS由Zephyr项目规划和管理,并作为首届嵌入式开源峰会(EOSS)的一部分进行。在这个令人期待已久的盛会中,全球Zephyr开发者们共同探讨了Zephyr实时操作系统(RTOS)的最新技术与发展趋势。作为一款开源、灵活和可扩展的嵌入式实时操作系统,Zephyr项目在2014年由英特尔发起,2016年作为Linux基金会项目正式面向公众启动,得到了全球范围内的广泛关注和采用。


ZDS 2023共70余个技术报告,涵盖了使用指导与展示、新功能与技术、架构修改与操作系统、多核异构与虚拟化、模拟器、测试、工业流程与代码管理、安全性、应用案例、工具与调试等丰富多样的内容。湖大嵌入式实验室的小伙伴们将对本次大会的所有技术报告进行逐一收集、整理与分享,尽最大努力为Zephyr开发者提供ZDS 2023技术报告的开发经验、实践成果以及解决方案的参考。



今天分享第33篇技术报告,由邹雨欣整理,题目为:

“把coredumps添加进Zephyr调试工具包”



作者简介

Eric Johnson

Eric Johnson是Memfault的固件解决方案工程师,帮助客户将Memfault集成到他们的产品中并开发MCU SDK。他此前曾在Walgreens Health、Athos、Acuity Brands和Lexmark从事嵌入式系统开发工作。他是一名谦虚的Zephyr错误修复贡献者。



文章简介

调查设备故障的根本原因很困难,特别是对于已部署的设备。通常使用本地调试和日志记录子系统用于确定问题原因。然而,这些工具在许多复杂场景中的实用性有限。本地调试需要物理访问,缺乏类似的操作环境,并且修改操作具有侵入性。日志记录的非结构化性质使得高效和效果分析变得困难。核心转储(Coredumps)以非侵入方式捕获故障发生时设备操作的详细信息。核心转储可用于防御性地捕获现有问题。本演讲介绍了coredumps以及如何在Zephyr实践中使用它们。核心转储数据是一种有价值但经常未得到充分利用的调试资源。coredump包含高度结构化的数据,可以使用GDB轻松解析。核心转储对于可以捕获的数据非常灵活。让想象力自由驰骋!有需要使用情况监控的内存板吗?将其添加到您的coredump中!导致独特堆栈溢出的传感器数据?将其添加到您的coredump中!涵盖的主题包括Zephyr的coredump子系统的简要概述、如何针对不同场景配置子系统、如何将GDB与coredump结合使用,以及coredumps的一些实践示例。



Coredumps总结

Zephyr内置了一个非常出色的日志记录子系统,但在某些情况下,日志记录只能带您到这儿(如下图所示)。我们都曾经遇到过这样的情况:您有一个组件会生成像垃圾邮件一样的日志消息,或者您刚刚在很长一段时间内收集了一堆日志,但很难对其进行筛选。

Zephyr的内置紧急消息也很棒,我使用过的大多数RTOS并没有提供这个。所以能够让用户了解致命错误是何时出现的以及深入了解该错误。与仅重新启动设备相比,这一功能确实很棒,但这里的问题是,它是静态的图像图片,它为您提供了很多详细信息,但您必须自己将图片拼凑在一起。

综上,这就是coredumps出现的原因。它的特征如下:

  • 由故障faults、内核恐慌kernel panics、断言asserts触发

  • 捕获寄存器和内存,以便以后进行分析

  • 数据可以立即流出来或存储在非易失性内存中



Coredump + Zephyr

一些coredump的基本数据组件用于捕获Ram中的不同区域并将它们保存为二进制格式,以便解码您的线程。您需要的是应用程序正在运行时的内核结构,这将帮助您深入了解每个线程的状态。当故障发生时,我们还可以从数据结构确定每个线程使用的堆栈。您还可以捕获对您重要的任何其他数据,比如您有一个正在运行的传感器,您正在使用某些环形缓冲区或者内存板之类的这些您想要捕获的数据,您可以将其包含在coredumps中以供以后分析。

Zephyr在触发声明(Assertion)时使用的调用图如下:

Zephyr触发故障处理调用图如下:

下图概述了coredump子系统的一些组件:

这里展示的示例是一个设备树节点,我定义该节点来捕获目标的GPIO块,这是基于某款芯片。我从该数据表中提取了内存区域信息,实际上从该目标的设备树板文件中提取了内存区域信息。

这是使用coredumps得到后端收集的输出的示例。您可以看到它被编码为ASCII文本,并且我们仍可以得到panic打印。我们将这个输出保存到一个文件中,当我们启动GDB服务器来加载coredumps本身时,它将成为输入。

我们从日志子系统获取文本输出,并使用 Zephyr提供的日志转换器作为一些内置脚本的一部分。以下为coredump的主要工具。



脚本拓展

  • GDB可以使用Python扩展支持构建


Zephyr工具链默认为no-py版本

加上“-py”使用oython  


  • 需要匹配系统Python安装

  • 用venv++包来管理包



Demo演示部分

视频地址:https://youtu.be/-ikuU6MjMiI?si= WhSsq- 7uQREuDpXR



未来工作

  • ISR-safe Flash支持:参见issue (https:// github.com/zephyrproject-rtos/zephyr/issues/59116)

  • 允许应用程序覆盖链接器内存区域

  • 鼓励用户提交与bugs/issues的核心转储

  • 添加使用Flash模拟区域后端的例子

  • 扩展west转换日志输出和运行coredump服务器



联系方式



Memfault中的Coredumps

我刚刚发布了一篇关于环形缓冲区 API 和 Zephyr 以及如何最好地使用它的帖子以及如何在实践中使用它,了解我们在 memfault 所做的事情。coredumps是我们的关键功能之一,以下是memfault中coredumps的样子:



致谢


Coredump subsystem maintainers and contributors Coredumps: A brief introduction and demo by Daniel Leung (https:// www. youtube.com/ watch?v=gQRiDkxbcLM)


https://github.com/ejohnso49/gdbundle-gpio

https://github.com/memfault/gdbundle



上一条:Embedded Systems News:Android 14发布,源代码已上传到AOSP 下一条:ZDS 2023技术报告分享第32篇:基于zephyr的微控制器SDK的开发与维护

关闭

嵌入式与网络计算湖南省重点实验室
版权所有 © 2023 湖南大学