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

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

3天内不再提示

用于分析可执行程序和内存转储的命令行工具介绍

桃芯科技 来源:桃芯科技 2023-11-03 17:00 次阅读

Axf Tool 是桃芯科技一个用于分析可执行程序和内存转储的命令行工具。该工具已集成到 ingWizard 的项目快捷菜单里。

ea18090e-7a26-11ee-939d-92fbcf53809c.png

这个工具包含多种功能:当程序编译成功后,可进行静态分析;出现 HardFault、Assertion 等问题时, 调用trace_full_dump2生成内存转储,再进行动态分析。从快捷菜单里运行工具虽然方便, 但是功能受限。通过命令行使用,功能更全面。下面介绍几种主要的功能。在命令行下通过axf_tool.exe help {function}可获得每种功能的详细信息

当工具需要读取编译后的可执行文件时,首先会自动查找,如果未找到,则弹出对话框,要求选择可执行文件。对于由 Wizard 生成的 Keil 或者 Gnu 工具链项目,工具一般能够自动找到编译后的可执行文件。

当工具需要读取 Dump 文件时,也会弹出对话框,要求选择 Dump 文件。Dump 文件即trace_full_dump2的输出。工具对于 Dump 文件的格式要求很低,允许其它内容存在。例如, 用串口工具长时间保存串口输出到文件,使用本工具时,不需要清理这个文件里所包含的其它日志信息 —— 除非其它日志也使用了 Intel Hex 格式。

静态分析

stack-usage

静态分析栈的使用情况,并报告栈空间使用最多前 N 条函数调用链。从快捷菜单调用时,显示前 3 条函数调用链。

借助这个功能统计栈用量,避免栈空间越界。开发者也可以 Web 版调用图工具 callgraph (Call Graph Visualization For Gnu Arm Toolchain (ingchips.github.io))图形化地查看栈用量、最大调用链。

局限性说明:

该工具不能保证给出的数据 100% 准确;当使用 Keil 时,建议同时参照 Keil 工具给出的统计信息,以较大的数据为准;

当使用了函数指针时,无法静态确定所要调用的函数(报告中标记 unknown),从而无法进行统计,导致结果偏小。

bt-api-thread-safety

分析对蓝牙 API 的调用,检查是否违反了单线程约定。使用这个功能时,需要“告诉”工具哪些函数肯定是只由蓝牙协议栈所调用的。—— 这些函数及只由这些函数所调用的函数就是符合单线程约定的,工具会把其它函数罗列出来供进一步确认。 从快捷菜单调用时,只认为setup_profile,user_packet_handler,att_read_callback和att_write_callback等 4 个函数肯定是只由蓝牙协议栈所调用的,符合单线程约定。如果需要“告诉”工具其它函数也没问题,那么可以使用命令行。比如, 在一个 GATT 客户端程序里,还有characteristic_discovery_callback等 3 个函数也确认只是协议栈的回调函数, 就可以把这 3 个也一起作为-bt_cb参数

axf_tool bt-api-thread-safety -bundle ING9187xx typical v1.9.39 ^
    -app path/to/app/executable ^
    -bt_cb setup_profile user_packet_handler att_read_callback att_write_callback  ^
    characteristic_discovery_callback descriptor_discovery_callback service_discovery_callback

基于 Dump 的动态分析

call-stack

尝试从内存转储中恢复出现问题时的函数调用栈。 下面某个ble_hcic_eif:766Assertion 的 Dump 分析, 从中我们看到整个调用栈的最底下是prvTaskExitError,这是 FreeRTOS 任务最底部的桩函数,再往上就是 程序的foo函数,它调用了蓝牙API gatt_client_write_value_of_characteristic,这违反了协议栈的单线程约定。

[....] try to load ...
[....] linking
[....] disassembly and loading
[....] linking
[....] loading ....
[INFO] ASSERTION found, more info: https://ingchips.github.io/web_apps/assertion_tool/index.html?q=%5BASSERTION%5D%20%40%20ble_hcic_eif.c%3A766
[ OK ] done
[....] top function @pc is `trace_full_dump`
[....] Call stack:
[....]  0. ├─ `trace_full_dump`
[....]  1. ├─ `cb_assertion+36`                                  (@...)
[....]  ...
[....]  ...
[....]  9. ├─ `gatt_client_write_value_of_characteristic+46`     (@...)
[....] 10. ├─ `foo+354`                                          (@...)
[....] 11. ├─ `prvTaskExitError`                                 (bottom of a FreeRTOS task)
[ OK ] ────┴───── (done)

说明:这个问题用 bt-api-thread-safety 也可检测出来。

history

给出 BLE 活动简史。通过这个功能可以观察出问题的前后一小段时间内 BLE 活动是否正常、是否符合预期。

下面的分析结果里的[ OK ] integrity check说明相关的内存数据基本正常,可以继续分析。出问题时,程序大致运行了 12 小时 51 分。目前存在一个连接间隔为 100ms 的连接,以及一个 Legacy 广播。

[....] try to ...
[....] linking
[....] loading ...
[ OK ] integrity check
current timer (T): 46266487352us (~46266487.352000ms) (~46266.487s) (~126.487)
[....] BLE activities (history & future) in descending order:
┌────┬──────────────┬─────────────────┬────────────┐
│  # │ Task         │            Time │  Duration  │
├────┼──────────────┼─────────────────┼────────────┤
│  0 │ Legacy_ADV   │         T+48420 │       4679 │
├────┼──────────────┼─────────────────┼────────────┤
│  1 │ CONN         │         T+40193 │       6250 │
├────┼──────────────┼─────────────────┼────────────┤
│  2 │ CONN         │             T+0 │      10306 │ <- current
├────┼──────────────┼─────────────────┼────────────┤
│  3 │ CONN         │          T-9807 │       6250 │
├────┼──────────────┼─────────────────┼────────────┤
│  4 │ CONN         │         T-19974 │      10167 │
├────┼──────────────┼─────────────────┼────────────┤
│  5 │ CONN         │         T-29974 │      10306 │
├────┼──────────────┼─────────────────┼────────────┤
...

check-heap

尝试检查堆的健康状态。这项功能支持多种堆:

FreeRTOS 提供的heap_4;

既支持软件包内置的 FreeRTOS,也支持外置 —— 前提:使用了相同或相近版本的heap_4。

Link Layer 内的堆。

check-task

在内存转储的帮助下动态检查 FreeRTOS 里的各个任务的情况,包含任务状态、栈用量等。对于栈用量统计,与stack-usage相比,优点是可以统计出stack-usage无法识别的函数指针等情况, 缺点是只能统计已执行的代码。

既支持软件包内置的 FreeRTOS,也支持外置 —— 前提:FreeRTOS 版本相同或相近。

Q&A

我的程序使用的是旧版本的 SDK,如果使用这个工具?

可以使用命令行。打开旧版本 Wizard 的 Options 窗口,进入 SDK 页面,确认软件包版本号, 比如 ING9187xx 的 typical v1.7.8。安装新版 SDK,进入 axf_tool 目录,以命令行方式使用,如:

 axf_tool call-stack -bundle ING9187xx typical v1.7.8 ^
     -app path/to/app/executable ^
     -dump path/to/dump/file

审核编辑:汤梓红

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

    关注

    8

    文章

    2767

    浏览量

    72764
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79541
  • 编译
    +关注

    关注

    0

    文章

    615

    浏览量

    32392
  • 命令行
    +关注

    关注

    0

    文章

    75

    浏览量

    10344
收藏 人收藏

    评论

    相关推荐

    在STM32实现命令行

    工作中的开发环境都是基于linux命令行交互,作为命令行的重度使用者,玩单片机也要使用命令行工具,百度了一些命令行
    发表于 12-09 11:32 1623次阅读

    dos模式下使用命令行模式调用c语言程序编译后的可执行文件

    `dos模式下使用命令行模式调用c语言程序编译后的可执行文件,可执行文件的文件名不能有空格,如果是带参数的main函数,直接在可执行文件之后
    发表于 01-07 14:06

    Linux命令行工具

    Linux 新手往往对命令行心存畏惧。部分原因是因为需要记忆大量的命令,毕竟掌握命令是高效使用命令行的前提不幸的是,学习这些命令并无捷径,
    发表于 07-25 08:10

    linux命令行下载工具

    wget是linux下常用的命令行下载工具,是Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件。而tget是一个简单的命令行BT下载
    发表于 07-25 07:02

    Mini shell命令行调试工具的相关资料分享

    @mini shell命令行调试工具介绍Mini shell 命令行调试工具(单片机、c语言)Mini shell是一个特别适合低
    发表于 01-24 08:15

    求分享用于查看SWD的Windows命令行工具

    的配置项,然后将 SWO 行输出从目标流式传输到标准输出或命名文件。明确地说,我不需要 GUI 工具,这是为了在没有 GUI 可能性的情况下在自动化下运行,我只需要将调试 printf() 发送到文件。我知道 ST-LINK 实用程序可以以 GUI 形式
    发表于 02-03 10:12

    Xilinx软件命令行工具:XSCT开发和调试

    了解如何使用XSCT,Xilinx软件命令行工具进行开发和调试。 该视频演示了XSCT如何充当Xilinx SDK的命令行控制台。
    的头像 发表于 11-21 06:02 1.3w次阅读

    Xilinx软件命令行工具进行开发和调试

    了解如何使用XSCT,Xilinx软件命令行工具进行开发和调试。 该视频演示了XSCT如何充当Xilinx SDK的命令行控制台。
    的头像 发表于 11-22 06:53 6100次阅读

    Golang基于flag库实现一个命令行工具

    Golang 标准库中的 flag 库提供了解析命令行选项的能力,我们可以基于此来开发命令行工具
    的头像 发表于 10-28 09:26 975次阅读

    Fcoder从命令行批量转换为TIFF

    命令行批量转换为TIFF 2TIFF图像转换软件是一个专业的命令行实用程序用于以批处理模式将办公文档和图像转换为TIFF。基于简单的命令行
    的头像 发表于 05-22 14:13 429次阅读
    Fcoder从<b class='flag-5'>命令行</b>批量转换为TIFF

    介绍Go里面经常使用到的命令行工具

    优秀的工具配合熟练的使用,往往可以让开发效率大幅度提升,本小节介绍 Go 里面经常使用到的命令行工具
    的头像 发表于 05-22 16:58 819次阅读
    <b class='flag-5'>介绍</b>Go里面经常使用到的<b class='flag-5'>命令行</b><b class='flag-5'>工具</b>

    linux虚拟机怎么调出命令行

    在Linux虚拟机中调出命令行界面,可以通过以下步骤实现: 打开虚拟机,进入到Linux系统。 在桌面或应用菜单中找到终端或命令行图标,点击打开。 输入命令行指令,执行相应的操作。 另
    的头像 发表于 11-08 11:28 1644次阅读

    pycharm命令行终端运行代码

    。 PyCharm的命令行终端允许开发者在IDE中直接执行命令,并查看输出结果。通过使用命令行终端,开发者可以在不离开PyCharm的情况下运行代码、调试程序
    的头像 发表于 11-22 11:20 1343次阅读

    idea如何输入命令行参数

    在许多软件开发和系统管理的任务中,我们经常需要向应用程序传递命令行参数。命令行参数是在运行时传递给程序的值,用于指定
    的头像 发表于 12-06 15:01 364次阅读

    HarmonyOS开发:【基于命令行(安装库和工具集)】

    使用命令行进行设备开发时,可以通过以下步骤安装编译OpenHarmony需要的库和工具
    的头像 发表于 04-25 21:03 24次阅读
    HarmonyOS开发:【基于<b class='flag-5'>命令行</b>(安装库和<b class='flag-5'>工具</b>集)】