2010-04-15 28 views
6

我正在做一個C++庫,這將是P /調用從C#,所以我無法斷點/調試的C + +的一面。所以我決定添加日誌記錄,以便我可以查看是否有任何錯誤以及它發生的位置。我添加一個#define DebugMode 1以確定我是否要登錄。 首先,我不是很擅長C++,但我知道足以解決問題。所以我的問題是:有沒有比#if調試模式更好的方式來記錄

  1. 難道還有比周圍的每一個記錄呼叫包裹#if DebugMode #endif一個更好的方法?我可以簡單地在Log方法內部執行該操作,並在日誌記錄未啓用的情況下返回,但這並不意味着那麼所有這些日誌記錄字符串都將位於程序集中?

  2. 我怎麼能效仿的printf確實有它的「...」操作使我能夠通過類似Log("Variable x is {0}", x);

  3. 是否有任何技巧,例如獲取行號或堆棧跟蹤某種信息我可以在日誌中使用?

謝謝!

+0

這並不直接回答這個問題,但是您可以*調試C++中的P/C++代碼,只需在「attach」對話框中,確保您已選擇「Native Code」作爲選項。 – 2010-04-15 04:59:10

+0

我在哪裏可以找到這個選項? – Daniel 2010-04-15 05:05:09

回答

5

一個簡單的方法就是定義一個宏,如果你不處於調試模式,它就什麼也不做。這樣,您不必在#ifdef中包裝每個電話。

一個簡單的實現可能是:

#if DebugMode 
#define MY_LOG(string, ...) printf(string, __VA_ARGS__) 
#else 
#define MY_LOG(string, ...) 
#endif 

還有其他的方法和庫(如boost),但這將很快得到你的東西。

+0

這是否包含程序集中的所有調試字符串?使用 #if DebugMode Log(「something」)#endif如果在禁用調試的情況下字符串不會被編譯到程序集中?這對你的解決方案是一樣的,因爲我喜歡它的外觀 – Daniel 2010-04-15 05:16:05

+0

如果DebugMode設置爲0,預處理器將剝離這些字符串。你只是說'MY_LOG(「某物的值爲%d」,某物);'你就定了。字符串將只在調試程序集中。 – 2010-04-15 05:36:54

+0

非常好,我想要的! – Daniel 2010-04-15 05:48:27

0

如何調試C++庫?在C++庫項目屬性中,調試,在命令字段中選擇C#客戶端,然後開始調試。

關於日誌記錄,你問關於C++或C#日誌記錄嗎? Bot只有在Debug配置中定義了預處理器常量,您可以使用它。

+0

C++日誌記錄。我無法在該字段中看到任何C#客戶端,只有regsvr32和瀏覽的能力 – Daniel 2010-04-15 05:04:44

+0

您是否知道調用C++ Dll的C#可執行文件的名稱?在命令字段中填寫此執行命名。如果你不知道客戶名稱,你如何運行它? – 2010-04-15 05:28:06

+0

哦,我明白了,不知道我應該放什麼。謝謝! – Daniel 2010-04-15 05:34:33

2

如果條件是一個編譯時間常數,所以你的代碼(預處理後)達這樣的:

if (0) 
    do the logging 

那麼編譯器一般是足夠聰明,去掉死去的代碼,包括您傳遞給它的字符串(除非您還在其他代碼中使用了未被剝離的字符串)。其作用類似於printf的

代碼非常簡單:

#include <stdarg.h> 

void log(char const &fmt, ...) { 
    if (do_logging) { 
     va_list args; 

     va_start(args, fmt); 
     vfprintf(output_file, fmt, args); 
    } 
} 

在一個宏,您可以使用__FILE____LINE__當前行號(它是在宏,而不是所謂的功能是非常重要的)和源文件名放在日誌中。使用上面的代碼,你可能(可能)想要在格式字符串之前傳遞它們。

+0

非常有幫助謝謝!啊,好吧我只是將這些作爲參數傳遞給日誌記錄方法 – Daniel 2010-04-15 05:17:37

2

我推薦使用Pantheios,然後你永遠不需要關心DEBUG /!DEBUG。該庫使用C++模板來確保在未啓用日誌記錄時不支付性能成本。它也是100%類型安全的並且可擴展到用戶定義的類型。

bar_t bar; 

pantheios::log_DEBUG("foo ", bar, " was doing something you should remember"); 

查看他們的performance page瞭解更多信息。

+1

我會檢查它,聽起來很酷 – Daniel 2010-04-15 05:47:17

+0

對不起,但同一頁面清楚地顯示日誌記錄未啓用時的性能成本。 – Cookie 2011-06-06 09:41:05

+0

爲什麼對不起?當啓用日誌記錄和未啓用日誌時,頁面顯示相關成本。在這兩種情況下,Pantheios都有出衆的表現。 (請記住,成本比例是對數。) – dcw 2011-06-11 02:15:59

相關問題