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

    文章

    3019

    浏览量

    74001
  • 程序
    +关注

    关注

    117

    文章

    3785

    浏览量

    81000
  • 编译
    +关注

    关注

    0

    文章

    657

    浏览量

    32851
  • 命令行
    +关注

    关注

    0

    文章

    77

    浏览量

    10385
收藏 人收藏

    评论

    相关推荐

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

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

    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

    实用 Linux 命令行使用技巧集锦

    下面介绍的都是一些命令行工具,这些工具在日常工作中都很有用。
    的头像 发表于 03-21 14:42 4748次阅读

    Setup软件安装可执行程序工具免费下载

    本文档的主要内容详细介绍的是Setup软件安装可执行程序工具免费下载。 etup.exe是电脑的可执行进程文件,在正常情况下setup.exe表示为系统的安装文件setup.exe,
    发表于 11-13 08:00 11次下载

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

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

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

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

    Git常见的误区和命令行工具等综述

    Git常见的误区和命令行工具等综述
    发表于 08-31 09:51 0次下载

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

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

    新的开源命令行工具west

    电子发烧友网站提供《新的开源命令行工具west.zip》资料免费下载
    发表于 11-11 09:25 0次下载
    新的开源<b class='flag-5'>命令行</b><b class='flag-5'>工具</b>west

    Fcoder从命令行批量转换为TIFF

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

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

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

    pycharm命令行终端运行代码

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

    eclipse怎么使用命令行

    命令行中使用Eclipse来完成一些特定的任务。本文将详细介绍如何在命令行中使用Eclipse。 首先,我们需要确保已经正确安装了JDK(Java Development Kit)和Eclipse
    的头像 发表于 12-06 11:26 2647次阅读

    idea如何输入命令行参数

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