很诡异的valgrind问题

标签:valgrind   内存泄漏   definitely lost   内存地址对齐    1791人阅读 评论(1)
分类:

valgrind是一个用于检测内存泄漏和内存越界等缺陷的工具,

检查sapp和插件时,如果dumpfile文件很大,valgrind运行极慢,等不及的话,可能会中途ctrl+c强制终止,

如果有报错误,基本都是对的:

"invalid read/write"表示有内存越界访问,

"definitely lost"表示指针彻底丢失,再也无法free了。


但下面这段代码,彻底颠覆了我的认知:

#include <stdio.h>

#include <stdlib.h>


struct meminfo_t{

void *ptr;

char valid_flag;

}__attribute__((packed, aligned(1)));


struct meminfo_t minfo[2];


int main()

{

    minfo[0].ptr = malloc(10);

    minfo[1].ptr = malloc(10);


    printf("If you press Ctrl+C now, valgrind will report definitely lost!");

    sleep(5);


    free(minfo[0].ptr);

    free(minfo[1].ptr);


    return 0;

}

代码逻辑很简单,不解释了,

编译运行后,  使用valgrind运行: 

valgrind --tool=memcheck --leak-check=full ./a.out 

正常运行, 等几秒钟程序自动退出后,什么错误都没有!


如果在打印"If you press Ctrl+C now, valgrind will report definitely lost!" 之后,立即按ctrl+c强制结束, 

竟然报"definitely lost: 10 bytes in 1 blocks"!

指针都在,也没被修改过,不可能泄漏啊!


测试时使用valgrind v3.12.0版本,以为有什么bug, 升级到v3.15.0,还是这样。

后来发现是因为内存地址不对齐问题,结构体struct meminfo_t是单字节对齐,导致第2个变量的ptr地址不是8字节的整数倍,

所以只报第2个 minfo[1].ptr 申请内存错误,第一个 minfo[0].ptr还是" still reachable"状态,

但为啥valgrind为什么会这么报错误,不解!!!

目前的解决办法就是:

     如果用valgrind检查内存泄漏问题,要等程序运行完毕,自行退出。

     针对sapp来说,必须使用dumpfile模式,而不能用tcpreplay回放包模式。

查看评论
1楼 罗成志 2019-10-30 13:19:54 [回复]

发表评论
  • 评论内容:
      
首页
团队介绍
发展历史
组织结构
MESA大事记
新闻中心
通知
组内动态
科研成果
专利
论文
项目
获奖
软著
人才培养
MESA毕业生
MESA在读生
MESA员工
招贤纳士
走进MESA
学长分享
招聘通知
招生宣传
知识库
文章
地址:北京市朝阳区华严北里甲22号楼五层 | 邮编:100029
邮箱:nelist@iie.ac.cn
京ICP备15019404号-1