內(nèi)存泄漏,我們經(jīng)常會遇到,如何檢測內(nèi)存泄漏,除了我們之前講過的 valgrind,還可以使用 gcc 自帶的工具 sanitizer。
從 gcc 4.8 開始,sanitizer 就被加入到 gcc 中,使用起來非常方便,可以檢測內(nèi)存泄漏、內(nèi)存越界、野指針等等。
下面來簡單演示下怎么使用。
void leak_memory() { char *ptr = (char *)malloc(128); }
比如這段代碼,一眼看出內(nèi)存泄漏。
# gcc test.c -o test -g -fsanitize=address
編譯的時候加上 -g 選項,方便后續(xù)調(diào)試,再加上 -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:~#
運行程序,會提示一大堆錯誤。雖然全是英文,但是閱讀起來也沒什么難度,只要你有英語三級的水平,應該能發(fā)現(xiàn),內(nèi)存泄漏了。
再來個代碼,棧內(nèi)存越界訪問。
void stack_overflow() { int array[5] = {0}; array[5] = 1; }
同樣的方法,編譯運行,提示棧內(nèi)存溢出。
至于其他的內(nèi)存問題,釋放不合法的內(nèi)存、內(nèi)存被釋放了又繼續(xù)使用、兩次釋放同一塊內(nèi)存,這些問題統(tǒng)統(tǒng)可以檢查。
非常實用的工具,調(diào)試代碼的時候,可以幫我們節(jié)省很多時間。
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3099瀏覽量
74847 -
調(diào)試工具
+關(guān)注
關(guān)注
1文章
51瀏覽量
12760 -
內(nèi)存泄漏
+關(guān)注
關(guān)注
0文章
40瀏覽量
9323
原文標題:內(nèi)存泄漏調(diào)試工具Sanitizer
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
如何去解決電信設(shè)備內(nèi)的泄漏檢測?
寫了一個內(nèi)存泄漏檢查工具
泄漏檢測儀校正與調(diào)整
泄漏檢測技術(shù)
泄漏檢測及定位原理

騰訊內(nèi)部內(nèi)存泄漏分析工具簡析

氨氣泄漏的危害_氨氣泄漏檢測儀怎么使用_氨氣泄漏檢測儀的使用方法
真空泄漏檢測儀的重要性和應用
基于C++代碼實現(xiàn)內(nèi)存泄漏檢測工具

評論