目录
用mtrace检测内存泄漏
使用addr2line定位代码
C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂
用mtrace检测内存泄漏
描述:
mtrace()函数为内存分配函数安装hook(钩子)函数【malloc()、realloc()、memalign(),free()】。这些hook函数记录有关内存分配和释放的跟踪信息。跟踪信息可用于发现内存泄漏,并尝试释放程序中未分配的内存。
muntrace()函数禁用mtrace()安装的hook函数,这样就不再为内存分配函数记录跟踪信息。如果mtrace()没有成功安装任何钩子函数,则muntrace()不执行任何操作。
使用第三方库mtrace,它是把所有的malloc和free写到一个文件。
#include <malloc.h>
#include <mcheck.h>
//export MALLOC_TRACE=./mtrace.log
int main() {
mtrace();
void *p1 = malloc(10);
void *p2 = malloc(20);
void *p3 = malloc(30);
void *p4 = malloc(40);
free(p1);
free(p2);
free(p4);
muntrace();
}
使用addr2line定位代码
addr2line -f -e mtrace -a 0x1895450
Linux下addr2line命令用于将程序指令地址转换为所对应的函数名、以及函数所在的源文件名和行号。当含有调试信息(-g)的执行程序出现crash时(core dumped),可使用addr2line命令快速定位出错的位置。
如果无法确定文件名或函数名,addr2line将在它们的位置打印两个问号;如果无法确定行号,addr2line将打印0或一个问号。
参数说明:
(1).-a:在函数名、文件名和行号信息之前,以十六进制形式显示地址。
(2).-b:指定目标文件的格式为bfdname。
(3).-C:将低级别的符号名解码为用户级别的名字。
(4).-e:指定需要转换地址的可执行文件名,默认文件是a.out。
(5).-f:在显示文件名、行号信息的同时显示函数名。
(6).-s:仅显示每个文件名(the base of each file name)去除目录名。
(7).-i:如果需要转换的地址是一个内联函数,则还将打印返回第一个非内联函数的信息。
(8).-j:读取指定section的偏移而不是绝对地址。
(9).-p:使打印更加人性化:每个地址(location)的信息都打印在一行上。
(10).-r:启用或禁用递归量限制。
(11).--help:打印帮助信息。
(12).--version:打印版本号。