内存泄漏检查-笔记

记录下编译器检查内存问题的一个flag -fsanitize=address,-fno-omit-frame-pointer! 除了valgrind 又有一个很有好的检察工具!
参考 者旨於陽:Linux高级调试与优化——Address Sanitizer

Address Sanitizer

  ASAN最早可以追溯到 LLVM 的 sanitizers项目(https://github.com/google/sanitizers),这个项目包含了AddressSanitizer,MemorySanitizer,ThreadSanitizer 和 LeakSanitizer等工具。这些工具可以检测用户空间的内存问题。通过在编译时加入指定的选项,就可以给用户程序加入 Address Sanitizer 功能。

  其中Address Sanitizer(ASAN)工具是一个内存错误检测器,可以检测以下问题:

  1)Out-of-bounds accesses to heap, stack and globals 堆、栈以及全局变量越界

  2)Use-after-free 即访问dangling pointer,已经free的指针

  3)Use-after-return (to some extent)

  4)Double-free, invalid free

  5)Memory leaks (experimental)

  ASan基于shadow memory实现,目前已经集成到Clang 3.1和GCC 4.8以上版本。

编译选项

-fsanitize=address 使能Address Sanitizer工具
-fsanitize=leak 只使能Leak Sanitizer,检测内存泄漏问题
-fno-omit-frame-pointer 检测到内存错误时打印函数调用栈
-O1 代码优化选项,可以打印更清晰的函数调用栈

demo

构造内存泄漏/越界的demo参考: -fsanitize=address 参数作用

本地测试截图

原文地址:https://www.cnblogs.com/sinpo828/p/13588498.html