2014-07-18 50 views
0

我正在寫一個profiler庫,它的任務是在應用程序中執行時打印函數的名稱。爲了達到這個目的,我使用/ Gh標誌編譯了應用程序並將其鏈接到具有_penter定義的分析器。 _penter調用一個函數來檢索名稱並打印它。這是正確的。標準庫函數調用的_penter

要刪除同一個函數正在打印兩次的實例,我在探查器中使用了unordered_set。

這也工作得很好;除非應用程序包含unordered_set類並使用它的方法。

當應用程序執行此操作時,剖析器對unordered_set方法的調用也會調用_penter,從而將代碼放入無限遞歸循環中,並導致一個stackoverflow。我已確定探查器不是使用/ Gh標誌構建的。

我的猜測是分析器和應用程序使用包含unordered_set方法的標準庫的相同副本。但我不知道如何解決這個問題。

我確實需要幫助解決這個問題。

非常感謝。

注:

  1. 我使用Visual Studio 2013
  2. Profiler是一個靜態庫。
  3. 兩個profiler.lib和Application.exe已建成使用/ MTD標誌
  4. 探查已libcpmtd.lib作爲一個附加的依賴
  5. 從libcmtd.lib無功能,如printf,被調用_penter。無論是從剖析器,還是從應用程序。
+0

我在類似的問題,你可以指定,如果你能解決這個問題 –

回答

0

我想你需要確保/ Gh選項是提供每個文件不是整個解決方案/項目。當/ Gh提供給某個編譯單元(即.cpp文件)時,它將使用_penter來處理文件中的每一個函數。當然這適用於這個cpp文件中帶有函數定義的頭文件。 std :: unordered_set中的函數得到檢測,因爲它們位於編譯的編譯單元中。我會嘗試使用預編譯的頭文件,或者您需要將定義移出您用/ Gh文件測試的文件。