Debug:mm track
mm_track start [callsite_cap] [data_cap] [depth] [skip]
start命令会分配所需内存,第一次运行mm_track时,会默认以callsite_cap=1024,data_cap=4096,depth=5,skip=2来运行,其中callsite_cap代表可以存储的调用栈数量,data_cap代表可以存储的栈帧的数量(每个栈可能有多个栈帧),depth代表栈回溯时最大的回溯深度,skip代表栈回溯时跳过的栈帧(有可能前两级栈帧无意义)
mm_track dump
dump命令会打印记录的malloc申请点,与申请数,释放数,使用数。
e.g.
第一次执行时会以默认参数执行mm_track start 1024 4096 5 :
bouffalolab />mm_track
mm leak trace started: callsite=1024 data=4096 depth=5 skip=2
mm leak trace alloc bytes:
ctx: req_bytes=40
entry: cap=1024 item_size=12 req_bytes=12288
bt_data: cap=4096 item_size=4 req_bytes=16384
untracked: cap=256 item_size=4 req_bytes=1024
total_req_bytes=29736
之后可以执行业务,以wifi_scan为例,多次执行:
bouffalolab />wifi_scan
bouffalolab />wifi_scan
第二次即以后会默认执行mm_track dump:
bouffalolab />mm_track
MM Leak Trace Report
state=started callsite_cap=1024/1024 data_cap=4096/4096 depth=5 skip=2
hash malloc free used
....
0xa56f7f49 2 0 2
....
callsites=25 bt_entries=25 data_used=123/4096 dropped=0
used blocks=3
发现0xa56f7f49 callsite有两块内存是used,有可能漏露,打印完整backtrace:
bouffalolab />mm_track bt 0xa56f7f49
0xa0057156 0xa0039fec 0xa0008cee 0xa000feee 0xa0012760
matched bt entries: 1
使用addr2line工具打印backtrace的函数名字:
:~/repo/new0/bouffalo_sdk$ riscv64-unknown-elf-addr2line -e examples/wifi/sta/wifi_tcp/build/build_out/wifi_tcp_bl616.elf -f 0xa0057156 0xa0039fec 0xa0008cee 0xa000feee 0xa0012760
platform_malloc
./examples/wifi/sta/wifi_tcp/build/build_out/components/wireless/wifi6/macsw_os_adapter/./components/wireless/wifi6/macsw_os_adapter/src/platform_bouffalo_sdk.c:104
macrx_upload
/home/wyb/repo/new0/bouffalo_sdk/components/wireless/xxxx.c:145
dma_upload
/home/wyb/repo/new0/bouffalo_sdk/components/wireless/xxxx.c:972
event_schedule
/home/wyb/repo/new0/bouffalo_sdk/components/wireless/xxxx.c:170 (discriminator 5)
event_loop
/home/wyb/repo/new0/bouffalo_sdk/components/wireless/xxxx.c:72
打开代码,检查相应的malloc是否没有相应的free。