line_index++;
continue;
}
addr = NULL;
if(strncmp(line, "alloc", 5) == 0 && n < MAX_ENTRY)
...{
sscanf(line, "alloc %p", &addr);
addrs_array[n] = addr;
lines_array[n] = line_index;
n++;
printf("a");
}
else if(strncmp(line, "free", 4) == 0)
...{
sscanf(line, "free %p", &addr);
for(i = 0; i < n; i++)
...{
if(addrs_array[i] == addr)
...{
lines_array[i] = -1;
break;
}
}
printf("f");
}
line_index++;
}
printf(" ");
fseek(fp, 0, 0);
i = 0;
line_index = 0;
while(fgets(line, sizeof(line), fp) != NULL)
...{
if(strncmp(line, "alloc", 5) == 0)
...{
if(lines_array[i] == line_index)
...{
printf("leak %s", line);
fprintf(fp_out, "*");
skip = 0;
i++;
}
else
...{
skip = 1;
}
}
else if(strncmp(line, "free", 4) == 0)
...{
skip = 1;
}
if(!skip)
...{
fputs(line, fp_out);
}
line_index++;
}
fclose(fp);
fclose(fp_out);
return 0;
}
把这个段代码编译成一个可执行文件mtrace,以前面记录的LOG为输入,再指定个输出文件,内存泄漏会被写到输出文件中,可以看到内存泄漏的地地址,大小和调用关系。
~~end~~