2017-10-05 102 views
0

我有一個使用tbb的C++程序,我正在使用GCC 6.2.1編譯64位Linux。 當我編譯與地址消毒劑(-fsanitize =地址)和運行單元測試時,產生這樣的輸出:如何使用泄漏消毒劑找到內存泄漏的原因

... 
[ PASSED ] 56 tests. 

================================================================= 
==12326==ERROR: LeakSanitizer: detected memory leaks 

Direct leak of 54 byte(s) in 3 object(s) allocated from: 
    #0 0x7f4c634fd020 in strdup (/usr/lib64/libasan.so.3+0x58020) 
    #1 0x301d215bb4 (/usr/lib64/libtbb.so.2+0x301d215bb4) 

SUMMARY: AddressSanitizer: 54 byte(s) leaked in 3 allocation(s). 
make[3]: *** [CMakeFiles/check] Error 1 
make[2]: *** [CMakeFiles/check.dir/all] Error 2 
make[1]: *** [CMakeFiles/check.dir/rule] Error 2 
make: *** [check] Error 2 

的代碼被編譯以優化關閉(-O0)和-fno-省略-幀 - 指針。我怎樣才能獲得更多關於泄漏的信息?

+1

你嘗試valgrid誤差不放棄? – gsamaras

+1

好點@gsamaras我會試着看看valgrind是否會返回更多的信息。 – Perennialista

回答

2

泄漏發生在系統庫中,據推測編譯時沒有-fno-omit-frame-pointer,因此Asan無法使用幀指針將其展開。您可以嘗試使用較慢,但更穩健的矮化開卷通過設置

# Or LSAN_OPTIONS, if you use standalone LSan 
export ASAN_OPTIONS=fast_unwind_on_malloc=0 

有關運行標誌的更多詳情,請參見herehere

順便說一句,你可以問LSAN通過

# Or LSAN_OPTIONS, if you use standalone LSan 
export ASAN_OPTIONS=exitcode=0:... 
+0

我試圖禁用fast_unwind_on_malloc並獲得更多信息,但仍不足以查明問題,看起來這也與pthread有關。我將不得不更多地關注它,但感謝您給我指導和解答我的問題! – Perennialista