//program on wiki
#include <stdlib.h>
#include <mcheck.h>
int main(void)
{
mtrace();
int * a;
a = malloc(sizeof(int));
muntrace();
return 0;
}
//set MALLOC_TRACE=path_to_your_log_file and export it
[zrlean@gentoo]$ MALLOC_TRACE=log.0
[zrlean@gentoo]$ export MALLOC_TRACE
[zrlean@gentoo]$ rm log.0
[zrlean@gentoo]$ gcc -g3 -o mleak mleak.c //notice that -g3 should be added to reverse map from assembly code to c code
[zrlean@gentoo]$ ./mleak
[zrlean@gentoo]$ ls log.0
log.0
[zrlean@gentoo]$ cat log.0
= Start
@ ./mleak:[0x40053f] + 0x8c04460 0x4
= End
//0x40053f -- is the place of the assmebly code where mem was allocated but not freed
// so we use gdb to find which line in the c code it corresponds to
//0x8c04460 -- is the pointer of the mem that is not freeed
//0x4 -- is the size of the memory leaked
[zrlean@gentoo]$ gdb mleak
GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-23.el5)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /users/zhalin/tmp/mleak...done.
(gdb) info line *0x40053f
Line 7 of "mleak.c" starts at address 0x400535 <main+13> and ends at 0x400543 <main+27>.
(gdb)
//so we know now 0x40053f corresponds to line 7 in mleak.cthat is
a = malloc(sizeof(int));
//and now we know that the address pointed by pointer a was failed to be freed.
mtrace的使用示例
最新推荐文章于 2023-05-13 21:00:00 发布