Axf Tool 是桃芯科技一個(gè)用于分析可執(zhí)行程序和內(nèi)存轉(zhuǎn)儲(chǔ)的命令行工具。該工具已集成到 ingWizard 的項(xiàng)目快捷菜單里。
這個(gè)工具包含多種功能:當(dāng)程序編譯成功后,可進(jìn)行靜態(tài)分析;出現(xiàn) HardFault、Assertion 等問(wèn)題時(shí), 調(diào)用trace_full_dump2生成內(nèi)存轉(zhuǎn)儲(chǔ),再進(jìn)行動(dòng)態(tài)分析。從快捷菜單里運(yùn)行工具雖然方便, 但是功能受限。通過(guò)命令行使用,功能更全面。下面介紹幾種主要的功能。在命令行下通過(guò)axf_tool.exe help {function}可獲得每種功能的詳細(xì)信息。
當(dāng)工具需要讀取編譯后的可執(zhí)行文件時(shí),首先會(huì)自動(dòng)查找,如果未找到,則彈出對(duì)話框,要求選擇可執(zhí)行文件。對(duì)于由 Wizard 生成的 Keil 或者 Gnu 工具鏈項(xiàng)目,工具一般能夠自動(dòng)找到編譯后的可執(zhí)行文件。
當(dāng)工具需要讀取 Dump 文件時(shí),也會(huì)彈出對(duì)話框,要求選擇 Dump 文件。Dump 文件即trace_full_dump2的輸出。工具對(duì)于 Dump 文件的格式要求很低,允許其它內(nèi)容存在。例如, 用串口工具長(zhǎng)時(shí)間保存串口輸出到文件,使用本工具時(shí),不需要清理這個(gè)文件里所包含的其它日志信息 —— 除非其它日志也使用了 Intel Hex 格式。
靜態(tài)分析
stack-usage
靜態(tài)分析棧的使用情況,并報(bào)告棧空間使用最多前 N 條函數(shù)調(diào)用鏈。從快捷菜單調(diào)用時(shí),顯示前 3 條函數(shù)調(diào)用鏈。
借助這個(gè)功能統(tǒng)計(jì)棧用量,避免棧空間越界。開發(fā)者也可以 Web 版調(diào)用圖工具 callgraph (Call Graph Visualization For Gnu Arm Toolchain (ingchips.github.io))圖形化地查看棧用量、最大調(diào)用鏈。
局限性說(shuō)明:
該工具不能保證給出的數(shù)據(jù) 100% 準(zhǔn)確;當(dāng)使用 Keil 時(shí),建議同時(shí)參照 Keil 工具給出的統(tǒng)計(jì)信息,以較大的數(shù)據(jù)為準(zhǔn);
當(dāng)使用了函數(shù)指針時(shí),無(wú)法靜態(tài)確定所要調(diào)用的函數(shù)(報(bào)告中標(biāo)記 unknown),從而無(wú)法進(jìn)行統(tǒng)計(jì),導(dǎo)致結(jié)果偏小。
分析對(duì)藍(lán)牙 API 的調(diào)用,檢查是否違反了單線程約定。使用這個(gè)功能時(shí),需要“告訴”工具哪些函數(shù)肯定是只由藍(lán)牙協(xié)議棧所調(diào)用的。—— 這些函數(shù)及只由這些函數(shù)所調(diào)用的函數(shù)就是符合單線程約定的,工具會(huì)把其它函數(shù)羅列出來(lái)供進(jìn)一步確認(rèn)。 從快捷菜單調(diào)用時(shí),只認(rèn)為setup_profile,user_packet_handler,att_read_callback和att_write_callback等 4 個(gè)函數(shù)肯定是只由藍(lán)牙協(xié)議棧所調(diào)用的,符合單線程約定。如果需要“告訴”工具其它函數(shù)也沒問(wèn)題,那么可以使用命令行。比如, 在一個(gè) GATT 客戶端程序里,還有characteristic_discovery_callback等 3 個(gè)函數(shù)也確認(rèn)只是協(xié)議棧的回調(diào)函數(shù), 就可以把這 3 個(gè)也一起作為-bt_cb參數(shù):
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 的動(dòng)態(tài)分析
call-stack
嘗試從內(nèi)存轉(zhuǎn)儲(chǔ)中恢復(fù)出現(xiàn)問(wèn)題時(shí)的函數(shù)調(diào)用棧。 下面某個(gè)ble_hcic_eif:766Assertion 的 Dump 分析, 從中我們看到整個(gè)調(diào)用棧的最底下是prvTaskExitError,這是 FreeRTOS 任務(wù)最底部的樁函數(shù),再往上就是 程序的foo函數(shù),它調(diào)用了藍(lán)牙API gatt_client_write_value_of_characteristic,這違反了協(xié)議棧的單線程約定。
[....] 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)
說(shuō)明:這個(gè)問(wèn)題用 bt-api-thread-safety 也可檢測(cè)出來(lái)。
history
給出 BLE 活動(dòng)簡(jiǎn)史。通過(guò)這個(gè)功能可以觀察出問(wèn)題的前后一小段時(shí)間內(nèi) BLE 活動(dòng)是否正常、是否符合預(yù)期。
下面的分析結(jié)果里的[ OK ] integrity check說(shuō)明相關(guān)的內(nèi)存數(shù)據(jù)基本正常,可以繼續(xù)分析。出問(wèn)題時(shí),程序大致運(yùn)行了 12 小時(shí) 51 分。目前存在一個(gè)連接間隔為 100ms 的連接,以及一個(gè) 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
嘗試檢查堆的健康狀態(tài)。這項(xiàng)功能支持多種堆:
FreeRTOS 提供的heap_4;
既支持軟件包內(nèi)置的 FreeRTOS,也支持外置 —— 前提:使用了相同或相近版本的heap_4。
Link Layer 內(nèi)的堆。
check-task
在內(nèi)存轉(zhuǎn)儲(chǔ)的幫助下動(dòng)態(tài)檢查 FreeRTOS 里的各個(gè)任務(wù)的情況,包含任務(wù)狀態(tài)、棧用量等。對(duì)于棧用量統(tǒng)計(jì),與stack-usage相比,優(yōu)點(diǎn)是可以統(tǒng)計(jì)出stack-usage無(wú)法識(shí)別的函數(shù)指針等情況, 缺點(diǎn)是只能統(tǒng)計(jì)已執(zhí)行的代碼。
既支持軟件包內(nèi)置的 FreeRTOS,也支持外置 —— 前提:FreeRTOS 版本相同或相近。
Q&A
我的程序使用的是舊版本的 SDK,如果使用這個(gè)工具?
可以使用命令行。打開舊版本 Wizard 的 Options 窗口,進(jìn)入 SDK 頁(yè)面,確認(rèn)軟件包版本號(hào), 比如 ING9187xx 的 typical v1.7.8。安裝新版 SDK,進(jìn)入 axf_tool 目錄,以命令行方式使用,如:
axf_tool call-stack -bundle ING9187xx typical v1.7.8 ^ -app path/to/app/executable ^ -dump path/to/dump/file
審核編輯:湯梓紅
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3122瀏覽量
75248 -
程序
+關(guān)注
關(guān)注
117文章
3826瀏覽量
82961 -
編譯
+關(guān)注
關(guān)注
0文章
679瀏覽量
33974 -
命令行
+關(guān)注
關(guān)注
0文章
81瀏覽量
10572
發(fā)布評(píng)論請(qǐng)先 登錄
dos模式下使用命令行模式調(diào)用c語(yǔ)言程序編譯后的可執(zhí)行文件
Mini shell命令行調(diào)試工具的相關(guān)資料分享
Setup軟件安裝可執(zhí)行程序工具免費(fèi)下載
Xilinx軟件命令行工具:XSCT開發(fā)和調(diào)試
Xilinx軟件命令行工具進(jìn)行開發(fā)和調(diào)試
mini shell命令行調(diào)試工具(單片機(jī)、c語(yǔ)言)

Golang基于flag庫(kù)實(shí)現(xiàn)一個(gè)命令行工具
Fcoder從命令行批量轉(zhuǎn)換為TIFF

評(píng)論