很诡异的valgrind问题
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 [回复]
- 强