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

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

3天内不再提示

如何使用静态呼叫流浏览器进行软件故障排除

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

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

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

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

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

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

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

常见的函数调用跟踪类型

您可以使用函数调用跟踪来了解代码流或识别错误。比较成功和失败场景之间的程序流程(通过函数调用跟踪)可以帮助您快速识别有问题的代码区域以进行进一步检查。

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

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

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

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

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

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

pYYBAGKxJT6AYoODAAEz7T7ZjmQ760.png

图 1:ELF 文件格式

二进制文件 (ELF) 分析

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

pYYBAGKxJUWAVo_jAADO_dMRhsI255.png

图2:静态函数分析流程

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

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

功能浏览器

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

浏览器图形用户界面

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

poYBAGKxJUyAYFzmAAGXx-TUVYQ613.png

图 3:功能列表显示

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

pYYBAGKxJVSAJmMpAAHSvFCubkc321.png

图 4:被调用的函数引用

pYYBAGKxJVyAaI2HAACzLirU1Uo364.png

图 5:从引用中调用

pYYBAGKxJWOAOttZAAIXqLawwTg260.png

图 6:功能列表 GUI

简化软件

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

审核编辑:郭婷

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

    关注

    134

    文章

    8740

    浏览量

    363446
  • ROM
    ROM
    +关注

    关注

    4

    文章

    527

    浏览量

    85155
  • 物联网
    +关注

    关注

    2885

    文章

    42361

    浏览量

    362117
收藏 人收藏

    评论

    相关推荐

    不只是前端,后端、产品和测试也需要了解的浏览器知识

    一、我们为什么要了解浏览器? 1. 对于前端开发者 1.浏览器是用户体验的第一线。我们需要了解浏览器的工作原理,才能有效地设计和实现用户界面,确保良好的用户体验。 2.好的产品需要考虑浏览器
    的头像 发表于 07-01 18:03 141次阅读
    不只是前端,后端、产品和测试也需要了解的<b class='flag-5'>浏览器</b>知识

    如何用python调用浏览器的视频?

    linda 我想用python调用浏览器的视频。 我使用cv2调用视频,但是失败了。 URL=\"http://192.168.4.1/face_stream\" cap = cv2.VideoCapture(URL) print(cap.isOpened()) 输出了
    发表于 06-26 08:15

    Opera浏览器引领潮流,全球首接端侧AI大模型

    昆仑万维旗下海外平台Opera宣布,其旗舰浏览器Opera One和游戏浏览器Opera GX将正式接入端侧AI大模型,成为全球首个实现这一突破的主流浏览器
    的头像 发表于 06-03 09:18 359次阅读

    Edge浏览器关闭Microsoft Rewards扩展原因揭晓

    据报道,近期德国等地的Microsoft Edge浏览器用户发现,安装或启动Microsoft Rewards扩展后,会出现“右上角扩展被Edge浏览器禁用以保障您的浏览器安全”的提醒窗口。
    的头像 发表于 04-10 09:55 339次阅读

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

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

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

    浏览器中运行JavaScript脚本是一种常见的方式,因为JavaScript是一种在Web浏览器中执行的脚本语言。下面是一个详细的,最少1500字的文章,介绍如何在浏览器中运行
    的头像 发表于 11-27 16:46 1735次阅读

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

    JS文件可以直接在浏览器中运行。JavaScript(简称JS)是一种广泛用于浏览器端编程的脚本语言。作为一种解释性语言,JS不需要编译,而是由浏览器逐行解释执行。因此,JS文件可以直接在浏览
    的头像 发表于 11-27 16:45 2295次阅读

    浏览器怎么打开javascript

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

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

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

    浏览器支持javascript怎么设置

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

    浏览器javascript被禁用怎么解开

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

    ie浏览器限制运行脚本

    IE浏览器限制运行脚本是指在Internet Explorer浏览器中,存在一些限制和安全策略,以保护用户的电脑免受恶意脚本的攻击。这些限制有助于防止在浏览器中执行恶意代码,保护用户的隐私和电脑
    的头像 发表于 11-26 11:19 1046次阅读

    python控制已经打开的浏览器

    Python是一种广泛使用的编程语言,它具有强大的功能和丰富的库。其中一个功能就是控制已经打开的浏览器。这篇文章将详细介绍如何使用Python控制已经打开的浏览器,并提供一些实际的示例。 一
    的头像 发表于 11-22 14:29 1862次阅读

    基于WAP的嵌入式浏览器设计

    电子发烧友网站提供《基于WAP的嵌入式浏览器设计.pdf》资料免费下载
    发表于 10-24 11:33 0次下载
    基于WAP的嵌入式<b class='flag-5'>浏览器</b>设计

    AI语音识别-我给浏览器加了个语音搜索功能

    本篇文章就采用华为云提供的在线语音识别服务给浏览器设计一个语音自动搜索的功能,编程语言采用C++,软件框架采用QT设计,浏览器内核采用QWebEngineView,在QT5.7以后,QT里就不
    的头像 发表于 07-10 09:18 1444次阅读
    AI语音识别-我给<b class='flag-5'>浏览器</b>加了个语音搜索功能