字段解释
重点关注的是“ all memory blocks”下面的log,其中几个关键的字段含义为:
address:用户malloc后,系统分配出来的地址,即malloc的返回值stat: 内存状态,used表示malloc后内存还在使用,free表示这块内存已经释放size:malloc的大小(单位:字节)caller:调用malloc的地方,即这块内存的使用者是谁。dye/pre-stat:AliOS Things使用的内存管理算法相关,这里不赘述。4、查看内存的API接口如果需要在代码中调用内存状态查询,AliOS Things也提供了如下API接口,该接口的输出与上述执行dumpsys mm的输出一致。
//需要包含的头文件
#include "aos/debug.h"
//接口调用方法
aos_debug_mm_overview(NULL)5、内存log解析工具的使用
面对上面dumpsys mm_info命令输出的这么多log,我们怎么分析呢?
配合解析脚本 coredump_parser.py, 我们可以得到下面的结果:
========== Show MM Statistic Info ========== -------------------------------------------------------------------------------------------------------------------------------------------------------------- Alloc Addr | Func | Cnt | Total Size | Line | File -------------------------------------------------------------------------------------------------------------------------------------------------------------- 0x208e03 | srand | 1 | 32 | | reent.c 0x1c5d9055 | aos_register_event_filter | 1 | 32 | 131 | /workspace/hass/AliOS-Things/components/utility/yloop/src/local_event.c 0x1c5dde4f | vfs_inode_set_name | 1 | 32 | 25 | /workspace/hass/AliOS-Things/core/vfs/vfs_inode.c 0x1c5d90e7 | aos_loop_init | 1 | 32 | 85 | /workspace/hass/AliOS-Things/components/utility/yloop/src/yloop.c 0x1c5d9161 | aos_poll_read_fd | 1 | 32 | 113 | /workspace/hass/AliOS-Things/components/utility/yloop/src/yloop.c 0x1c5d916b | aos_poll_read_fd | 1 | 32 | 114 | /workspace/hass/AliOS-Things/components/utility/yloop/src/yloop.c 0x1c5ddc59 | vfs_lock_create | 1 | 40 | 17 | /workspace/hass/AliOS-Things/core/vfs/vfs_adapt.c 0x1c5d7901 | kv_lock_create | 1 | 40 | 33 | /workspace/hass/AliOS-Things/core/kv/kv_adapt.c 0x1c5d7935 | kv_sem_create | 1 | 40 | 82 | /workspace/hass/AliOS-Things/core/kv/kv_adapt.c 0x1c5d8e03 | event_open | 1 | 40 | 40 | /workspace/hass/AliOS-Things/components/utility/yloop/src/device.c 0x207b67 | localtime | 1 | 80 | | reent.c 0x1c5d5cf9 | aos_mutex_new | 2 | 80 | 147 | /workspace/hass/AliOS-Things/core/osal/aos/rhino.c 0x1c5d5da7 | aos_queue_new | 1 | 80 | 349 | /workspace/hass/AliOS-Things/core/osal/aos/rhino.c 0x22d14f | krhino_sem_dyn_create | 3 | 120 | 102 | /workspace/hass/AliOS-Things/core/rhino/k_sem.c 0x22c3af | krhino_mutex_dyn_create | 3 | 120 | 125 | /workspace/hass/AliOS-Things/core/rhino/k_mutex.c 0x229ad7 | osThreadCreate | 4 | 128 | 250 | /home/william.wgj/work/code/shenmu_lite/shenmu_github/shenmu_aos/platform/mcu/haas1000 /drivers/out/haas1000_normalization/../../rtos/rhino/cmsis/cmsis_os.c 0x22b5cf | krhino_event_dyn_create | 4 | 128 | 102 | /workspace/hass/AliOS-Things/core/rhino/k_event.c 0x2078a7 | __sfmoreglue | 1 | 432 | | reent.c 0x1c5d6251 | proc_onecmd | 1 | 512 | 156 | /workspace/hass/AliOS-Things/core/cli/cli.c 0x22d86f | task_dyn_create | 3 | 600 | 280 | /workspace/hass/AliOS-Things/core/rhino/k_task.c 0x1c5d671b | cli_init | 1 | 800 | 697 | /workspace/hass/AliOS-Things/core/cli/cli.c 0x207dc7 | __smakebuf_r | 1 | 1024 | | reent.c 0x1c5d8979 | hal_uart_init | 1 | 2048 | 333 | /workspace/hass/AliOS-Things/platform/mcu/haas1000/hal/uart.c 0x1c5dd8fd | uring_fifo_init | 1 | 5120 | 25 | /workspace/hass/AliOS-Things/components/dm/ulog/ulog_ring_fifo.c 0x22d865 | task_dyn_create | 3 | 142336 | 275 | /workspace/hass/AliOS-Things/core/rhino/k_task.c --------------------------------------------------------------------------------------------------------------------------------------------------------------
使用方法
将串口输出的异常log 拷贝至coredump_parser.py的同级目录中,文件名任意,这里取名为log,coredump_parser.py路径为:https://github.com/alibaba/AliOS-Things/tree/dev_3.1.0_haas/components/utility/debug_tools将编译生成的elf文件(aos.elf)也拷贝至coredump_parser.py的同级目录,elf 路径为solutions/helloworld_demo/out/helloworld_demo/aos.elf执行下面命令(举例)python coredump_parser.py log aos.elf
如果系统提示如“arm-none-eabi-gcc”找不到,表示使用的工具链没有在系统PATH下,
arm-none-eabi-gcc在 AliOS Things代码下载时自带的工具链toolchian里,toolchian路径为:
~/.aliot/arm-none-eabi/main/bin
可以将这个路径添加到系统PATH路径下,也可以使用-p参数,如
python coredump_parser.py log aos.elf -p ~/.aliot/arm-none-eabi/main/bin
这个工具会将系统内存malloc情况输出到表格中,并且按照Total Size从小到大排序,同时指出了每个内存块的申请者caller在代码中的位置,一目了然。如果开发者定位或者怀疑此时系统内出现了内存泄漏,那么经过上面的解析出的系统内存使用,我们可以直接看出哪个模块的内存只有申请没有释放了,一般是Total Size 最大的那个点!
6、小结系统内存问题的定位比较复杂,使用上面几个方法,可以有效的帮助开发者定位排查一些内存问题,希望大家多多尝试上面的命令,灵活使用,才能发挥出AliOS Things的诊断调试的强大功能。
开发者支持
HaaS解决方案中心:https://haas.iot.aliyun.com/
HaaS技术社区:https://blog.csdn.net/HaaSTech
开发者钉钉群和公众号见下图,开发者钉钉群每天都有技术支持同学值班。
Rainbond 5.3.1 发布 支持100 组件一键云原生交付 2021年7月5日 Rainbond 5.3.1 ...
监控Linux服务器上磁盘每秒寻道的最佳方式是什么? 有不同的工具监控Linux服务器...
如何转移 域名 ?域名转移注册商时必须向原注册商索取到?转移密码(auth-code)...
Internet Information Services(IIS)部署Web项目登录Window Server桌面 a. 按w...
操作场景 本文以 云服务器 的操作系统为“CentOS 7.4 64位”为例,采用fdisk分区...
作者:Mintimate 博客: https://www.mintimate.cn Mintimates Blog,只为与你分...
1.爱上一个人跟拉屎一样简单,忘记一个人跟吃屎一样难。 2.大姨妈是吐血鬼,卫...
你还记得最近因为优秀的推送文案而让你印象深刻的App是哪个么?某游戏的热血邀约...
什么 邮箱 能发送大量群发邮件?任何邮箱发送大量邮件或群发相同的邮件内容,都...
Docker 支持持久化和非持久化两种方式的存储。 非持久化化存储自动创建,从属于...