内存检测工具sanitize
生活随笔
收集整理的這篇文章主要介紹了
内存检测工具sanitize
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以前用過valgrind這個內存泄露檢查工具,這個工具相對簡單,對于一些復雜的內存泄露可能無法解析出來而且有一個問題就是只有檢測的進程退出后才會輸出內存泄露信息。
今天介紹的工具sanitize可以在檢測到內存泄露第一時間立刻終止進程,并且它可以深入檢測(隨應用進程一起編譯)。下面舉例說明:
#include <stdlib.h> #include <unistd.h> extern void __lsan_do_leak_check(); void FooBar() {malloc(7); }int main() {FooBar();while(1) {//死循環__lsan_do_leak_check();sleep(10);}return 0; }我這里的編譯方式如下:
/opt/gcc-7.3.0/bin/gcc -Wl,-rpath=/opt/gcc-7.3.0/lib64 -fsanitize=leak -llsan ?a.c編譯參數必須指定 -fsanitize=leak,如果檢測非法內存則指定-fsanitize=address。編譯完成后運行:
[root@localhost ~]# ./a.out ================================================================= ==11456==ERROR: LeakSanitizer: detected memory leaksDirect leak of 7 byte(s) in 1 object(s) allocated from:#0 0x7f93d7ee8136 in __interceptor_malloc ../../../../libsanitizer/lsan/lsan_interceptors.cc:53#1 0x400674 in FooBar (/root/a.out+0x400674)#2 0x400685 in main (/root/a.out+0x400685)#3 0x7f93d7b303d4 in __libc_start_main (/lib64/libc.so.6+0x223d4)SUMMARY: LeakSanitizer: 7 byte(s) leaked in 1 allocation(s). [root@localhost ~]#如上圖所示,能夠將堆棧信息打印出來(有些時候打印堆棧信息不全)。如果我們在希望在進程終止時打印內存泄露,那么我們在代碼中可以不調用__lsan_do_leak_check();方法。
sanitize還提供了很多參數,可參考https://github.com/google/sanitizers/wiki
總結
以上是生活随笔為你收集整理的内存检测工具sanitize的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 内存检测工具
- 下一篇: qt5使用内存检测工具vld查看内存泄漏