7
- 根據2008年的帖子(我現在找不到它),glibc heap check不適用於多線程環境。現在是2010年的情況嗎?
- 默認啓用堆檢查嗎? (gcc 4.1.2)?我沒有設置MALLOC_CHECK_,不知道調用mcheck(),但仍然有時會用backtrace獲得雙免費的glibc錯誤。也許它是由一些編譯標誌啓用的?
默認情況下,在不使用malloc_check_或mcheck()的情況下,glibc會執行一些不會損害性能的小檢查,如在同一內存塊上調用兩次free()。這就是爲什麼你得到這些消息的一些原因,但是你不會將所有由malloc提供的消息替換成你可以通過使用MALLOC_CHECK_獲得的API(它們做了更多的測試,但是也有更多的cpu密集)。你可以通過觸發一個錯誤來檢查這個錯誤,並且使用和不使用malloc_check_來測試它。例如,對於一個簡單的雙免費(),我得到「雙免費或腐敗(頂部)」或「免費():無效指針」錯誤,這取決於我設置MALLOC_CHECK_或不。
要回答1個問題,mcheck依賴於malloc掛鉤,因爲它們存在(如15年),並且這些掛鉤不是線程安全的。
來源:glibc的/的malloc/malloc.c,http://sourceware.org/bugzilla/show_bug.cgi?id=9939
使用Valgrind的,問題變得有些毫無意義。 http://valgrind.org/ – msw 2010-05-14 07:26:48
@msw valgrind很好,它們不會相互碰撞。 MALLOC_CHECK_比valgrind輕,並且不需要任何操作frp,用戶(例如,通過lvalgrind運行應用程序,檢查valgrind的輸出),一旦你設置它。 valgrind沒有這種情況。任何方式,我的問題不是關於valgrind :) – dimba 2010-05-14 07:42:55