valgrind android 内存泄露,valgrind 内存泄漏分析

本文详细介绍了valgrind作为内存泄漏检查工具的功能和使用方法,特别是其在Linux环境下的应用。valgrind能够检测四种类型的内存泄漏,并通过详细的日志输出帮助开发者定位问题。文章通过实例展示了如何理解和分析内存泄漏,如明确泄漏、间接泄漏、可能泄漏和仍可访问的内存。此外,还提到了valgrind在检查非法读/写内存、使用未初始化的变量等其他内存错误方面的用途。最后,文章给出了valgrind的使用参数及其在多进程场景下的注意事项,并提供了一个日志过滤脚本,帮助开发者更高效地处理valgrind输出的大量错误信息。
摘要由CSDN通过智能技术生成

概述

valgrind 是 Linux 业界主流且非常强大的内存泄漏检查工具。在其官网介绍中,内存检查(memcheck)只是其其中一个功能。由于只用过其内存泄漏的检查,就不拓展分享 valgrind 其他功能了。

valgrind 这个工具不能用于调试正在运行的程序,因为待分析的程序必须在它特定的环境中运行,它才能分析内存。

内存泄漏分类

valgrind 将内存泄漏分为 4 类。

明确泄漏(definitely lost):内存还没释放,但已经没有指针指向内存,内存已经不可访问

间接泄漏(indirectly lost):泄漏的内存指针保存在明确泄漏的内存中,随着明确泄漏的内存不可访问,导致间接泄漏的内存也不可访问

可能泄漏(possibly lost):指针并不指向内存头地址,而是指向内存内部的位置

仍可访达(still reachable):指针一直存在且指向内存头部,直至程序退出时内存还没释放。

明确泄漏

官方用户手册描述如下:

This means that no pointer to the block can be found. The block is classified as "lost",

because the programmer could not possibly have freed it at program exit, since no pointer to it exists.

This is likely a symptom of having lost the pointer at some earlier point in the

program. Such cases should be fixed by the programmer.

其实简单来说,就是 内存没释放,但已经没有任何指针指向这片内存,内存地址已经丢失 。定义比较好理解,就不举例了。

valgrind 检查到明确泄漏时,会打印类似下面这样的日志:

==19182== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1

==19182== at 0x1B8FF5CD: malloc (vg_replace_malloc.c:130)

==19182== by 0x8048385: f (a.c:5)

==19182== by 0x80483AB: main (a.c:11)

明确泄漏的内存是强烈建议修复的,这没啥好争辩的。

间接泄漏

官方用户手册描述如下:

This means that no pointer to the block can

be found. The block is classified as "lost", because the programmer could not possibly have freed it at program

exit, since no pointer to it exists. This is likely a symptom of having lost the pointer at some earlier point in the

program. Such cases should be fixed by the programmer.

间接泄漏就是指针并不直接丢失,但保存指针的内存地址丢失了。比较拗口,咱们看个例子:

struct list {

struct list *next;

};

int main(int argc, char **argv)

{

struct list *root;

root = (struct list *)malloc(sizeof(struct list));

root->next = (struct list *)malloc(sizeof(struct list));

printf("root %p roop->next %p\n", root, root->next);

root = NULL;

return 0;

}

丢失的是 root 指针,导致 root 存储的 next 指针成为了间接泄漏。

valgrind 检查会打印如下日志:

# valgrind --tool=memcheck --leak-check=full --show-reachable=yes /data/demo-c

==10435== Memcheck, a memory error detector

==10435== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.

==10435== Using Valgrind-3.17.0 and LibVEX; rerun with -h for copyright info

==10435== Command: /data/demo-c

==10435==

root 0x4a33040 roop->next 0x4a33090

==10435==

==10435== HEAP SUMMARY:

==10435== in use at exit: 16 bytes in 2 blocks

==10435== total heap usage: 3 allocs, 1 frees, 1,040 bytes allocated

==10435==

==10435== 8 bytes in 1 blocks are indirectly lost in loss record 1 of 2

<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值