了解到的工具有如下几个
valgrind(最强大)
mtrace(linux gnu自带,但是只能检测malloc和free)
debug_new(针对c++,重载operator new,placement new实现的),原理地址https://www.ibm.com/developerworks/cn/linux/l-mleak2/index.html
还有个命令malloc_stats(),可以在程序里或者gdb调用,可以查看堆内存的静态统计,在gdb中使用
call malloc_stats()
下面介绍下valgrind,内存泄漏用的是memcheck,非常强大,但非常重量级,如果程序本身消耗资源(线程较多或其他),可能不能正常或流畅的跑起来
使用valgrind --tool=memcheck --leak-check=full ./exe 即可,停止的时候会把可能泄露的地方列出来
另外可以使用gdb内加在valg,然后可以输一些valg的命令功能更加强大
who_points_at这个可以查看一块内存是属于哪个指针的命令,那么就能找到申请的地方。这个功能我问了很多人都不知道,对于排查内存泄漏很有用
更详细的文档地址
https://stackoverflow.com/questions/12663283/dumping-contents-of-lost-memory-reported-by-valgrind
2020-8-21日更新
pmap可以查看进程分配的内存地址
翻看gdb官网得知可以直接在gdb内看内存地址对应的符号
info symbol [Address]
但使用后发现好像只能查看bss段,css段内的符号(比如全局变量,函数地址等),不能查看堆上的符号
文档地址https://visualgdb.com/gdbreference/commands/info_address
另外一个根据coredump查看内存泄露的方法,主要是用hexdump查看内存信息,获取规律。原文地址
https://stackoverflow.com/questions/27598986/how-to-analyze-memory-leak-from-coredump
2020-08-28更新
更强大的工具addr2line
dmesg这个命令,是用来显示开机信息的。若一些程序出错,也会记录错误信息
性能分析工具有gperftools(需要编译进代码),perf(无须编译),systemtap 最强
https://zhuanlan.zhihu.com/p/22572231
2020-09-05更新
内核提供的工具 Address Sanitizer,消耗性能比valgrind小很多