内存检查方法

简介

使用valgrind工具检查内存泄露、内存越界等问题

安装

sudo apt install valgrind

使用valgrind

cd examples/hello_world
maixcdk build

# 输出简要日志
valgrind ./build/hello_world

# 输出更详细日志
# --tool=memcheck:指定工具为memcheck, memcheck是默认工具,该参数可以省略
# --leak-check=full:详细的显示每个单独的内存泄露信息
# --log-file=valgrind.log:将内存泄露检查结果输出到指定文件, valgrind.log为自定义的文件名
valgrind --tool=memcheck --leak-check=full --log-file=valgrind.log ./build/hello_world

观察valgrind输出日志的方法

观察内存泄露摘要信息

内存泄露时可以看到类似如下日志

LEAK SUMMARY:
   definitely lost: 48 bytes in 3 blocks.   # 一定泄露的内存,例如一级指针指向的内存没有free
   indirectly lost: 32 bytes in 2 blocks.   # 间接泄露的内存,例如二级指针指向的内存没有free,间接导致二级指针指向的一级指针指向的内存没有free
     possibly lost: 96 bytes in 6 blocks.
   still reachable: 64 bytes in 4 blocks.
        suppressed: 0 bytes in 0 blocks.

观察内存异常详细信息

内存操作有多种异常,可以看到类似如下日志,详情见官方文档查看具体含义。

8 bytes in 1 blocks are definitely lost in loss record 1 of 14  # 找到内存泄露的位置
   at 0x........: malloc (vg_replace_malloc.c:...)
   by 0x........: mk (leak-tree.c:11)
   by 0x........: main (leak-tree.c:39)

88 (8 direct, 80 indirect) bytes in 1 blocks are definitely lost in loss record 13 of 14
   at 0x........: malloc (vg_replace_malloc.c:...)
   by 0x........: mk (leak-tree.c:11)
   by 0x........: main (leak-tree.c:25)

遇到无法解决的问题

官方文档