Debug:mm track

来自Bouffalo Lab Docs
跳转到导航 跳转到搜索

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。