目录
用了一下asan,感觉比valgrid好用,以后用asan,asan的使用方法内存错误分析工具----asan(AddressSanitizer)的介绍和使用_陈 洪 伟的博客-CSDN博客
Valgrind是一款用于内存调试、内存泄漏检测以及性能分析、检测线程错误的软件开发工具,Valgrind 是运行在Linux 上的多用途代码剖析和内存调试软件。主要包括Memcheck、Callgrind、Cachegrind 等工具,每个工具都能完成一项任务调试、检测或分析。可以检测内存泄露、线程违例和Cache 的使用等。Valgrind 基于仿真方式对程序进行调试,它先于应用程序获取实际处理器的控制权,并在实际处理器的基础上仿真一个虚拟处理器,并使应用程序运行于这个虚拟处理器之上,从而对应用程序的运行进行监视。应用程序并不知道该处理器是虚拟的还是实际的,已经编译成二进制代码的应用程序并不用重新进行编译,Valgrind 直接解释二进制代码使得应用程序基于它运行,从而能够检查内存操作时可能出现的错误。所以在Valgrind下运行的程序运行速度要慢得多,而且使用的内存要多得多 - 例如,Memcheck工具下的程序是正常情况的两倍多。因此,最好在性能好的机器上使用Valgrind。
(1)--help:显示帮助信息;
(2)--version:显示 valgrind 版本;
(3)--tool=
(4)--quiet:安静地运行,只打印错误信息;
(5)--verbose:更详细的信息,增加错误数统计;
(6)--trace-childer=no | yes:跟踪子线程;
(7)--track-fds=no | yes:跟踪打开的文件描述;
(8)--time-stamp=no | yes:增加时间戳到 Log 信息;
(9)--log-fd=
(10)--log-file=
(11)--xml=yes:将错误信息以xml格式输出,只有memcheck可用;
(12)--xml-file=
(13)--error-limit=no | yes:如果错误太多,则停止显示新错误;
(14)--error-exitcode=
(15)--leak-check=no | summary | full:对发现的内存泄露给出的信息级别,只有memcheck可用。(建议添加)
(16)--show-reachable=no | yes,用于控制是否检测控制范围之外的泄漏,比如全局指针、static指针等。
(17)–num-callers=(num):这个值默认是12,最高是50。表示显示多少层的堆栈,设置越高会使Valgrind运行越慢而且使用更多的内存,但是在嵌套调用层次比较高的程序中非常实用。
(18)--trace-children=no | yes,是否跟入子进程。
我一般这样使用valgrind
valgrind --leak-check=yes --log-file=valgrind_log.txt ./xxx
如果上述方法生成的log不足以帮助你判断出内存泄漏的准确位置,那么就把自己的代码逐段注释掉,查找内存泄漏。