0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用静态呼叫流浏览器更快地对嵌入式设备软件进行故障排除

星星科技指导员 来源:嵌入式计算设计 作者:Hari Nagalla 2022-11-21 14:26 次阅读

由于具有射频连接和微控制器内核的低成本集成片上系统设备的进步,物联网IoT) 设备呈指数级增长。

其中许多设备主要基于Arm® Cortex-M®架构。随着硬件的进步,嵌入式软件在跟上新的连接协议、协议栈和框架方面发挥着重要作用。

然而,连接设备的激增给嵌入式软件工程师带来了挑战,尤其是同时在多个设备和框架上工作的应用程序和维护工程师。

了解新设备软件、框架和协议栈的工作原理可能非常耗时,并且会限制工程师快速解决问题的能力。设计文档和内联源代码注释可能会有所帮助,但它们可能不容易访问,并且可能无法全面了解代码的工作原理。

在这些情况下,工程师依靠他们的独创性、足智多谋和使用集成开发环境 (IDE) 的源代码浏览。虽然这在尝试理解软件代码流时有所帮助,但这是一个耗时且乏味的过程,并且有更好的方法。

在本文中,我将介绍一种使用现有工具链实用程序来生成软件的静态函数调用层次结构并更快更好地理解软件流的新方法。

函数调用跟踪的常见类型

可以使用函数调用跟踪来了解代码流或识别 bug。比较成功和失败方案之间的程序流(通过函数调用跟踪)可以帮助您快速识别代码中存在问题的区域,以便进一步检查。

函数调用跟踪补充了基于 IDE 的源代码浏览,以更好地了解整个软件实现,并且可以分为两个常见类别:

运行时函数调用跟踪。这是一个侵入性的过程,需要检测源代码。像 GNU Compiler Collection 这样的工具链提供了放置函数调用的检测,这需要重建代码来重新生成新的二进制文件,但会导致额外的代码大小和更长的执行时间。对于缺少内存的资源受限的 IoT 设备,运行时函数调用跟踪可能不是一个可行的选择。此外,您无法保证检测的代码的行为与未检测的代码相同。

静态函数调用。对于基于只读存储器 (ROM) 的设备,检测不是一个可行的选择。尽管您可以简单地使用 Eclipse 或 Source Insight 等 IDE 浏览源代码以了解软件实现,但这是一个繁琐的过程。一些 IDE(通常是昂贵的商业版本)可以派生静态函数调用图。这些静态函数调用浏览器通常范围有限,如果源代码中有条件编译,则可能无法提供整个调用流的准确图片。

但是,可以从二进制可执行和可链接格式 (ELF) 文件生成静态调用流浏览器,该文件反映了实际的二进制代码。

使用静态呼叫流浏览器更快地修复软件

让我们使用设备的 ELF 二进制映像来生成函数调用引用详细信息。如图 1 所示,其思路是获取 ELF 二进制文件,并通过各种代码生成工具(如 TI 的目标文件显示 (armofd) 和拆装器 (armdis) )传递它,以生成函数列表和调用引用数据库。生成数据库后,在简单的树浏览器中显示调用层次结构和流,以查看函数调用引用。这些静态调用流图还可以通过将运行时 ROM 代码消息日志覆盖在静态函数树的顶部来帮助调试 - 这种组合将提供对运行时代码流的洞察并帮助您隔离问题。

pYYBAGN7GmKAR_u_AAFtC8PlGFA735.png

图 1:ELF 文件格式

二进制文件 (ELF) 分析

该ELF文件包含一个程序头,节头,以及代码和数据节。工具链提供了各种工具来检查和以可读格式显示 ELF 二进制文件内容。在 TI,我们使用 armofd 和 armdis 等实用程序名称来获取 Arm 反汇编中的功能详细信息和完整的程序编码。

pYYBAGN7GmqALZYUAADzD0d8ZGg045.png

图2:静态函数分析的过程

解析引擎遍历反汇编代码,并通过带链接的分支 (BL) 和带链接和交换的分支 (BLX) 指令检查函数调用,查找每个函数的所有调用函数,并填充函数数据库。数据库本身被安排为Adelson-Velsky和Landis自平衡搜索树,以便快速搜索和浏览。

编译器优化可能会通过直接分支到被调用的函数来扭曲某些函数调用。这些函数没有任何堆栈分配,因此解析引擎需要足够智能才能检测这些编译器优化。

函数浏览器

称为 Java 帧 (JFrames) 的简单图形用户界面 (GUI) 界面为函数调用浏览选择感兴趣的函数。选择一个函数将显示两个帧,一个用于“被调用方/被调用函数”,另一个用于“被调用自”函数。这些帧显示具有进一步节点扩展的分层树结构,如图 3、4、5 和 6 所示。

浏览器图形用户界面

函数列表显示所有可用函数,使您能够选择感兴趣的函数来浏览参考文献。

pYYBAGN7GnGAFEtaAAGDeVrYZL4756.png

图 3:功能列表显示

可以在树中进一步向下导航以查看函数调用的可能性。

pYYBAGN7GnmAbdZbAAGZpw-V-lU508.png

图 4:调用的函数引用

poYBAGN7GoOAOxy6AACo9zMJYR0595.png

图 5:从引用调用

poYBAGN7GoqAaUSlAAIveYQZPpM392.png

图 6:功能列表 GUI

简化软件

通过使用此方法从二进制映像派生静态调用流程图,您现在可以更好地了解软件功能流,并补充源代码浏览,以更深入地了解软件实现。最重要的是,这种方法可以加快流程并使故障排除软件更简单。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    7470

    浏览量

    150956
  • 嵌入式
    +关注

    关注

    5064

    文章

    18994

    浏览量

    302601
  • 物联网
    +关注

    关注

    2902

    文章

    44179

    浏览量

    370739
收藏 人收藏

    评论

    相关推荐

    TTL电路的故障排除技巧

    的工作原理有一个清晰的理解。TTL电路的基本单元是逻辑门,包括与门、或门、非门等。了解这些基本单元的工作原理和特性,可以帮助我们更快地定位问题。 2. 视觉检查 在开始故障排除之前,进行
    的头像 发表于 11-18 10:35 19次阅读

    Windows 11预览版安装受阻,微软提示更新设备浏览器

    该提示翻译如下:由于安全性考虑,您的设备浏览器未能顺利连接至认证服务。若您确非恶意行为者,请尝试更新相关设备浏览器,以获取完整使用体验
    的头像 发表于 03-05 14:29 965次阅读

    嵌入式工程师需要掌握哪些技术?

    Bluetooth、Wi-Fi和LoRa等的了解也是有益的。 5. 调试和故障排除能力:嵌入式系统开发中经常会遇到各种问题和错误。因此,具备良好的调试和故障
    发表于 03-04 16:38

    如何通过浏览器访问Web页面进行固件更新的方法?

    如果电脑没有安装 TIA PORTAL 软件,但是 CPU 之前激活了 Web 服务功能,可以通过电脑联网 CPU,然后打开浏览器浏览到 CPU 的方式
    的头像 发表于 02-25 14:51 1373次阅读

    嵌入式软件设计的原则分享

    嵌入式软件开发如果具有更好的阅读性、扩展性以及维护性,就需要考虑很多因素。今天给大家分享几个嵌入式软件设计的原则。
    发表于 02-25 10:54 641次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b>设计的原则分享

    嵌入式软件开发应该掌握哪些知识?

    两个部分组成,其中嵌入式软件是指在嵌入式系统中运行的程序,用于控制硬件并提供特定的功能和服务。嵌入式软件应用广泛,包括汽车、医疗
    发表于 02-19 11:23

    嵌入式学习步骤

    语言编写。但是,有些嵌入式系统也使用其他编程语言,例如Python或Java。 (3).了解硬件:深入了解您要控制的硬件设备的功能和特性。您需要了解嵌入式系统的处理、内存、I/O端口
    发表于 02-02 15:24

    嵌入式软件开发和软件开发的区别

    嵌入式软件开发和软件开发是两个不同的概念,它们在一些关键方面有着明显的区别。嵌入式软件开发是指开发嵌入
    的头像 发表于 01-22 15:27 2149次阅读

    嵌入式硬件和软件哪个好?

    ,如复位电路、常用滤波电路、功放电路、高速信号传输线的匹配电路等;故障定位、解决问题的能力;设计文档的组织编写技能! 那对于嵌入式软件工程师来说:
    发表于 12-05 15:17

    js脚本怎么在浏览器中运行

    JavaScript脚本。 一、JavaScript简介 JavaScript是一种高级的、直译型的计算机编程语言,用于Web页面的交互功能。它专门为浏览器设计,能够在浏览器中直接运行,而无需编译
    的头像 发表于 11-27 16:46 2693次阅读

    js文件可以直接浏览器运行吗

    载和运行。 在Web开发中,JS常被用于实现动态交互效果和页面逻辑控制。通过将JS代码嵌入到网页的HTML文件中,浏览器可以在页面加载过程中自动执行JS,实现网页的动态效果和用户交互。 在HTML文件中,可以使用 当浏览器解析到
    的头像 发表于 11-27 16:45 3835次阅读

    浏览器怎么打开javascript

    浏览器是一种用于浏览和访问互联网页面的应用程序,而JavaScript是一种常用的网页编程语言,用于给网页添加交互和动态效果。本文将详细探讨如何在浏览器中打开JavaScript,并解释
    的头像 发表于 11-26 11:25 2413次阅读

    浏览器需要支持javascript怎么解决

    JavaScript是一种流行的脚本语言,用于对网页进行动态交互和功能增强。几乎所有现代浏览器都支持JavaScript,但在某些情况下,用户可能需要采取措施来确保浏览器支持JavaScript
    的头像 发表于 11-26 11:23 4808次阅读

    浏览器支持javascript怎么设置

    和JavaScript之间的关系。浏览器是一个软件应用程序,用于解析和渲染网页。它可以是桌面应用程序(例如Chrome,Firefox和Safari)或移动应用程序(例如Safari和Chrome
    的头像 发表于 11-26 11:22 1372次阅读

    浏览器javascript被禁用怎么解开

    JavaScript是一种前端开发语言,通过运行在浏览器中的脚本来给网页增加动态交互和功能性。然而,有时候我们可能会遇到浏览器禁用JavaScript的情况,这会导致某些网页无法正常运行或功能受限
    的头像 发表于 11-26 11:21 1.9w次阅读