2010-08-26 58 views
2

當我在我的代碼運行Valgrind的,我得到的如何解決valgrind池分配器問題?

12 bytes in 1 blocks are possibly lost in loss record 545 of 29,459 
    at 0x7FCC050: operator new(unsigned int) (vg_replace_malloc.c:214) 
    by 0x87E39B1: __gnu_cxx::new_allocator<T>::allocate(unsigned int, void const*) (new_allocator.h:89) 
    ... 
    ... 

從各個崗位我能確定這是「不是一個錯誤,而是一個功能」幾千個例子,因爲它是GNU的方式庫爲stl提供高效的分配。也就是說,看到其中的數千個數據庫很難找到真正的錯誤。

如何設置Valgrind不顯示這些錯誤?

注:我已經嘗試設置環境變量GLIBCXX_FORCE_NEW G_SLICE=always-malloc G_DEBUG=gc-friendly,resident-modules並沒有什麼改變

+0

您使用的是什麼版本的valgrind/gcc/libc /(和distro可能)? memchecking我的C++代碼時,我從來沒有遇到過這些問題。 – BatchyX 2010-09-07 10:39:36

+0

gcc版本3.4.2,valgrind 2.4.0,glibc 2.3.3-98.103.408.0.PTF.486631,SuSE Linux – user108088 2010-09-07 17:15:41

+0

這些版本嚴重過時。是不是可以用更新的軟件進行測試?這些人差不多5-7歲。自那時起,這個問題一定得到解決。 – BatchyX 2010-09-08 17:42:56

回答

1

使用valgrind --gen-suppressions=yes來生成它顯示的錯誤抑制報表。然後,您可以使用--suppressions=<filename>來重新運行valgrind,並使用這些錯誤消息進行抑制。

+0

這也是我現在刪除的答案:)但是如果你抑制操作符new,valgrind還有什麼? – 2010-08-27 07:25:36

0

您是否嘗試過在Valgrind FAQ中禁用alloc池的建議?請注意,環境變量根據所使用的gcc版本而變化。

+0

如果您所指的是GLIBCXX_FORCE_NEW,它沒有任何幫助。你是否指另一種禁用分配池的方式? – user108088 2010-09-07 17:16:50

+0

是的,但是,經過進一步調查,它看起來像有一個海灣合作委員會的錯誤(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31777)。存在一個潛在的競爭條件,其中用於強制使用new的變量可以超過1,並且pool_allocator.h中的測試用於== 1.不幸的是,並未顯示該錯誤中描述的修復已包含在任何gcc版本。 – 2010-09-07 17:52:13