2010-09-25 52 views
2

有誰知道如何動態獲取傳遞到函數中的所有變量值以便記錄?如何獲取使用宏傳遞給函數的變量(目標c)

我正在尋找一種簡單的方法(如使用編譯器宏)來記錄函數,並將變量值傳遞給它(然後將其寫入日誌文件,以便我們可以輕鬆地找到輸入這導致功能崩潰)

我一直在試圖

#define NFDebug(s, ...) NSLog(@"DEBUG: %s: %@", __PRETTY_FUNCTION__, \ 
[NSString stringWithFormat:(@"%@"), ##__VA_ARGS__]) 

,這給了一切,但變量的值

回答

1

我用的是這樣的:

#ifdef YOUR_DEBUG_ENABLER_SYMBOL_ONLY_SET_IN_DEBUG_BUILDS 
#define DEBUG_ONLY(_code_) _code_ 
#else 
#define DEBUG_ONLY(_code_) 
#endif 

#define DebugLog(_str, ...) DEBUG_ONLY(NSLog(@"%s: " _str, __func__, ## __VA_ARGS__)) 

請注意,NSLog中的_str之前沒有逗號 - 這意味着您在調用代碼中使用的字符串被追加(由編譯器)到「%s:」字符串,以成爲複合格式字符串NSLog的。無論您想要打印的參數都可以包含在傳入的格式字符串中。 %s的適用於_ _ FUNC _和你_STR適用於變量中傳遞的休息:

float f; 
int i; 
NSString* s; 
// Initialise f, i, and s to something 
... 
// Log the values only when in debug mode, with function name auto-prepended 
DebugLog(@"float is: %f - int is: %d - string is: %@", f, i, s); 

這樣做,你可以登錄你想要的任何文字和變量,有條件地對調試的優勢,並將函數名稱自動添加到輸出中。

+0

爲了簡單起見,我把它留在了上面,但實際上我有不同的日誌級別(DebugLog0,DbugLog1等),因此您可以根據需要設置所需的日誌級別並獲取更多/更少的日誌記錄。這可以通過兩種方式完成:編譯時設置的日誌級別;或者在運行時設置日誌級別。您可以輕鬆地在此添加/展開。擁有DebugAssert,DebugWarn,ReleaseLog和ReleaseError宏也是有意義的。 – jhabbott 2010-10-03 16:44:29