1. 程式人生 > 其它 >Linux下記憶體檢測工具:asan :編譯-連線-執行選項

Linux下記憶體檢測工具:asan :編譯-連線-執行選項

一、簡介

Linux下記憶體檢測工具:asan
ASAN(Address-Sanitizier)早先是LLVM中的特性,後被加入GCC 4.8,在GCC 4.9後加入對ARM平臺的支援。因此GCC 4.8以上版本使用ASAN時不需要安裝第三方庫,通過在編譯時指定編譯CFLAGS即可開啟開關。

1、編譯選項
1.1 Gcc編譯選項
# -fsanitize=address:開啟記憶體越界檢測

# -fsanitize-recover=address:一般後臺程式為保證穩定性,不能遇到錯誤就簡單退出,而是繼續執行,採用該選項支援記憶體出錯之後程式繼續執行,需要疊加設定ASAN_OPTIONS=halt_on_error=0才會生效;若未設定此選項,則記憶體出錯即報錯退出

ASAN_CFLAGS += -fsanitize=address -fsanitize-recover=address

# -fno-stack-protector:去使能棧溢位保護

# -fno-omit-frame-pointer:去使能棧溢位保護

# -fno-var-tracking:預設選項為-fvar-tracking,會導致執行非常慢

# -g1:表示最小除錯資訊,通常debug版本用-g即-g2

ASAN_CFLAGS += -fno-stack-protector -fno-omit-frame-pointer -fno-var-tracking -g1

1.2 Ld連結選項
ASAN_LDFLAGS += -fsanitize=address -g1

如果使用gcc連結,此處可忽略。

2、ASAN執行選項
2.1 ASAN_OPTIONS設定
ASAN_OPTIONS是Address-Sanitizier的執行選項環境變數。

# halt_on_error=0:檢測記憶體錯誤後繼續執行

# detect_leaks=1:使能記憶體洩露檢測

# malloc_context_size=15:記憶體錯誤發生時,顯示的呼叫棧層數為15

# log_path=/home/xos/asan.log:記憶體檢查問題日誌存放檔案路徑

# suppressions=$SUPP_FILE:遮蔽列印某些記憶體錯誤

export ASAN_OPTIONS=halt_on_error=0:use_sigaltstack=0:detect_leaks=1:malloc_context_size=15:log_path=/home/xos/asan.log:suppressions=$SUPP_FILE

除了上述常用選項,以下還有一些選項可根據實際需要新增:

# detect_stack_use_after_return=1:檢查訪問指向已被釋放的棧空間

# handle_segv=1:處理段錯誤;也可以新增handle_sigill=1處理SIGILL訊號

# quarantine_size=4194304:記憶體cache可快取free記憶體大小4M

ASAN_OPTIONS=${ASAN_OPTIONS}:verbosity=0:handle_segv=1:allow_user_segv_handler=1:detect_stack_use_after_return=1:fast_unwind_on_fatal=1:fast_unwind_on_check=1:fast_unwind_on_malloc=1:quarantine_size=4194304

2.2 LSAN_OPTIONS設定
LSAN_OPTIONS是LeakSanitizier執行選項的環境變數,而LeakSanitizier是ASAN的記憶體洩漏檢測模組,常用執行選項有:

# exitcode=0:設定記憶體洩露退出碼為0,預設情況記憶體洩露退出碼0x16

# use_unaligned=4:4位元組對齊

export LSAN_OPTIONS=exitcode=0:use_unaligned=4

3、總結
實際開發環境中,可能存在gcc版本低,使用asan做記憶體檢查時,需要連結libasan.so庫的情況。其次,平臺軟體通常都會內部實現一套記憶體操作介面,為使用asan工具,需要替換成glibc提供的介面。此時,可以通過LD_PRELOAD環境變數解決這類問題。

export LD_PRELOAD= libasan.so.2:libprelib.so #vos_malloc --> malloc

最後,ASAN選項比較多,本文不一一羅列&解釋,讀者可自行百度!
————————————————
版權宣告:本文為CSDN博主「_Hansen_」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/hanlizhong85/article/details/78076668

有時候,不小心知道了一些事,才發現自己所在乎的事是那麼可笑。