內存泄漏,我們經常會遇到,如何檢測內存泄漏,除了我們之前講過的 valgrind,還可以使用 gcc 自帶的工具 sanitizer。
從 gcc 4.8 開始,sanitizer 就被加入到 gcc 中,使用起來非常方便,可以檢測內存泄漏、內存越界、野指針等等。
下面來簡單演示下怎么使用。
void leak_memory() { char *ptr = (char *)malloc(128); }
比如這段代碼,一眼看出內存泄漏。
# gcc test.c -o test -g -fsanitize=address
編譯的時候加上 -g 選項,方便后續調試,再加上 -fsanitize=address,得到二進制文件。
root@Turbo:~# ./test ================================================================= ==374040==ERROR: LeakSanitizer: detected memory leaks Direct leak of 128 byte(s) in 1 object(s) allocated from: #0 0x7d41794fd9c7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69 #1 0x62d90d0dc25e in leak_memory /root/test.c:5 #2 0x62d90d0dc4e7 in main /root/test.c:43 #3 0x7d417902a1c9 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58 #4 0x7d417902a28a in __libc_start_main_impl ../csu/libc-start.c:360 #5 0x62d90d0dc184 in _start (/root/test+0x1184) (BuildId: a2e83d98f01d2da94cd327af18f596c19fc367bb) SUMMARY: AddressSanitizer: 128 byte(s) leaked in 1 allocation(s). root@Turbo:~#
運行程序,會提示一大堆錯誤。雖然全是英文,但是閱讀起來也沒什么難度,只要你有英語三級的水平,應該能發現,內存泄漏了。
再來個代碼,棧內存越界訪問。
void stack_overflow() { int array[5] = {0}; array[5] = 1; }
同樣的方法,編譯運行,提示棧內存溢出。
至于其他的內存問題,釋放不合法的內存、內存被釋放了又繼續使用、兩次釋放同一塊內存,這些問題統統可以檢查。
非常實用的工具,調試代碼的時候,可以幫我們節省很多時間。
-
內存
+關注
關注
8文章
3108瀏覽量
74983 -
調試工具
+關注
關注
1文章
51瀏覽量
12781 -
內存泄漏
+關注
關注
0文章
40瀏覽量
9351
原文標題:內存泄漏調試工具Sanitizer
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
寫了一個內存泄漏檢查工具
使用開源工具Address Sanitize致力于Go工具鏈的優化和特性的支持
泄漏檢測技術
騰訊內部內存泄漏分析工具簡析

評論