2014-07-07 16 views
1

,我可以包括Valgrind的頭在運行時知道我的軟件是否已在運行Valgrind的:查找其中的valgrind的版本是在C/C++運行

#include <valgrind/valgrind.h> 

bool RunningOnValgrind() 
{ 
    return RUNNING_ON_VALGRIND ? true : false; 
} 

這在valgrind manual被記錄在案。

我希望能夠知道我正在運行的valgrind是否支持AVX指令。我如何編寫一個返回此信息的函數?

valgrind release notes,我知道這些從版本3.8開始支持。因此,一個解決方案是產生一個進程來執行valgrind --version然後解析輸出,但是必須有更好的方法。

回答

3

如果你的valgrind/valgrind.h看,你看,你可以包括valgrind.h後,這樣的valgrind檢查版本號:

#if defined(__VALGRIND_MAJOR__) && defined(__VALGRIND_MINOR__) \ 
     && (__VALGRIND_MAJOR__ > 3         \ 
      || (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 8)) 
    /* code to say avx is supported */ 
    #endif 

這有很大的侷限性,但是:它假設你使用的是全球安裝的版本,並且你的路徑不是指向一些不在默認位置(我已經完成的)的個人用戶構建的valgrind,它還假定你正在建立你將要運行的機器上valgrind,而不是圍繞預先構建的可執行文件(根據我的經驗,這經常發生)發佈,因此您不能依賴該文件。

考慮到這一點,產生一個valgrind --version子過程和檢查輸出可能確實是最好的選擇。

+0

你說的限制是爲什麼我需要在運行時獲得版本而不是編譯時的確切原因! –

+0

對我來說很有意義,正如我的文章所暗示的那樣。但是,它看起來像valgrind沒有API可以在運行時調用來檢索主要/次要版本號,因此在子進程中運行它並解析輸出可能是你留下的 - 並且希望你不是' t使用'--trace-children = yes'選項在valgrind中運行你的程序(因爲有valgrind「valgrind本身」來獲取版本號可能會很慢......) – JohnH

+1

向valgrind的bug跟蹤器提交了一個補丁:https:/ /bugs.kde.org/show_bug.cgi?id=338365。讓我們看看現在會發生什麼...... –

2

您可以使用VALGRIND_MAJOR在運行時檢測版本,或使用--version標誌獲取確切版本。

+0

__VALGRIND_MAJOR__給出了編譯時使用的版本,而不是valgrind的運行時版本。 –

+0

VALGRIND_MAJOR在編譯時定義,您可以在運行時使用它。 –