2015-03-18 47 views
0

我試圖使用斷點用於記錄,而不是NSLog,但我有麻煩訪問像__FUNCTION__「神奇」的編譯器的變量,__FILE__iOS的Objective-C中的XCode:記錄斷點和「魔術」變量

Debugger CommandLog Message斷點似乎都以與NSLog相同的方式評估變量。

NSLog(@"%s", __FILE__)導致的/Users/nbirkholz/Documents/project_name/folder_name/file_name.m

當我設置一個Debugger Command斷點po __FILE__正確調試輸出我收到的"Parse" { 'P' 'a' 'r' 's' 'e' <nil>}

調試輸出當我使用p __FILE__我收到的(const char [6]) $1 = "Parse"

類似的結果調試輸出從p/po__func__/__PRETTY_FUNCTION__/__FUNCTION__/__LINE__

po [NSString stringWithFormat:@"file is: %s", __FILE__]導致 error: too many arguments to method call, expected 1, have 2

po (void)NSLog(@"the file is: %s", __FILE__)返回<timestamp> <module> the file is: Parse

expr/expression(void)NSLog(@"the file is: %s", __FILE__)給出相同的結果。

同樣,添加Log Message斷點或者未能計算表達式在所有或產生類似的結果,我似乎無法找到工作在@ @

包封例如表達式語法的the file is @[email protected]Log Message相生the file is "Parse"

有沒有辦法讓這個工作沒有直接添加NSLog()到代碼並讓它正確地評估變量?

+0

我不知道你在問什麼。你似乎在尋找如何在日誌中使用這些編譯器變量,而不是使用NSLog,但似乎給出了工作示例,「當我使用p __FILE__'時,我接收到(const char [6])的調試輸出$ 1 =」解析「」 - 你在期待什麼? – CuriousRabbit 2015-03-18 21:52:30

+0

@CuriousRabbit更新了問題。輸出是不同的。 – 2015-03-18 22:02:52

回答

2

這些「魔術變量」實際上是宏,它們的值在編譯期間被引用的點處派生。它們在調試時不會具有與編譯時相同的值。實際上,在調試時,您很可能會獲得編譯到調試器中的變量值。 I.E.,而不是來自MySpecialProgram的代碼的文件名,但是在調試器中執行的代碼的文件名,可能是命令解析器。

要麼把日誌中的代碼,如:

NSLog(@"this is %s line %d function %s", __FILE__, __LINE__, __FUNCTION__); 

或轉讓瓦爾的東西,你可以訪問:

char[] foo = __FILE__; 
+0

謝謝。把它們作爲變量的參考文檔以及類似accessor的語法讓我對它們感到困惑。 – 2015-03-18 22:40:33

1

我不確定在這裏,但afaik這些是預處理宏,我認爲你不能讓它們在運行時工作。

+0

有道理,謝謝。 – 2015-03-18 22:09:07