2013-10-12 45 views
13

無論這些語句可以通過LLDB處理......爲什麼是無法拿出NSString的結果,並打印出來爲什麼LLDB無法評估這個表達?

expr -o -- [NSString stringWithFormat:@"%@", @"Wow this doesnt work??"] 

po [NSString stringWithFormat:@"%@", @"Wow this doesnt work??"] 

Picture of problem here

回答

7

看來,表達命令在lldb中通常不能用 可變參數列表來評估函數。它甚至無法用一個簡單的C函數:

int foo(char *msg, ...) 
{ 
    return 17; 
} 
 
(lldb) expr foo("bar") 
(int) $2 = 17 

(lldb) expr foo("bar", 2) 
error: no matching function for call to 'foo' 
note: candidate function not viable: requires 1 argument, but 2 were provided 
error: 1 errors parsing expression 

所以這看起來像是LLDB的錯誤(或無功能)。

8

這更多的是學術而不是實際利益,但原來的問題和馬丁的答案其實有不同的原因。在這兩種情況下,lldb實際上正確地拒絕使用比聲明的參數更多的參數來調用函數,但是出於不同的原因得到實際的定義錯誤。

在第一種情況下,lldb實際上並沒有方法調用的調試信息[NSString stringWithFormat:format,...]。事實證明,編譯器不會爲程序使用的每個函數發出調試信息,而只是它定義的函數。這個限制主要是爲了保持調試信息的大小可管理。

因此,調試器必須諮詢ObjC運行時,以獲取這些套件函數的額外類型信息。但是,運行時類型信息不編碼可變參數函數的變量參數。

在第二種情況下,您看到的實際上是clang的調試輸出中的一個錯誤。它無法發出告知調試器函數是可變參數函數的那一點信息。

無論如何,在lldb中,您可以通過使用「expr-prefix」文件向lldb的表達式解析器引入常用函數的聲明來解決這類問題。例如,在馬丁的情況下,我做一個文件「/tmp/expr-prefix.lldb」包含行:

extern "C" int foo (char *msg, ...); 

然後在LLDB,我做的:

(lldb) settings set target.expr-prefix /tmp/expr-prefix.lldb 

然後您就可以在表達式解析器中調用該函數。幾個警告與此功能。這個「表達前綴」文件被包含在你用「print」命令運行的所有表達式中,所以不要在那裏放太多的東西,否則會減慢一般的表達式解析。不要試圖做這樣的事情:

#import <Cocoa/Cocoa.h> 

,這將是非常緩慢的,可能無論如何都不會工作 - 因爲這取決於一整套調試器不知道的#define的。

但是,如果你有幾個這樣的功能,你真的需要打電話,但是不能,因爲我們要麼不知道簽名,或者不知爲什麼會出錯。

extern「C」是必需的,因爲lldb將表達式解析爲ObjC++。

如果你想要建立一個ObjC方法的原型,你需要在你爲這個方法建立原型的類的擴展上做這件事;我們經常有一個基本的類def'n,編譯器不喜歡將方法添加到已知的類中,只有擴展名。

+0

吉姆,你可以給Objective-C的方法的一個特定的內聯LLDB語法例如任何機會呢?我嘗試添加像你所說的類擴展(除其他外),但試驗和錯誤使我無處可去。一次嘗試:'expr @interface NSPredicate(NSPredicateExt) - (NSString *)predicateFormat; +(NSPredicate *)predicateWithFormat:(NSString *)predicateFormat參數:(va_list)argList; @end NSPredicate * $ tmpPred = [NSPredicate predicateWithFormat:@「location!=%@」,self.location];' – Jeff

6

我發現這篇文章的解決方法: http://www.cimgf.com/2012/12/13/xcode-lldb-tutorial/

例如,當我嘗試使用此語法來調用方法:

po [NSString stringWithFormat:@"%@", @"MyName"]; 

調試器的錯誤是:

error: too many arguments to method call, expected 1, have 2 
error: 1 errors parsing expression 

但你可以試試這個:

po [[NSString alloc] initWithFormat:@"%@", @"MyName"]; 

調試器的信息是:在調試器

$4 = 0x0a6737f0 MyName 
+0

對於Xcode 7.3,您的答案不再適用。 '(lldb)po [[NSString alloc] initWithFormat:@「%@」,@「MyName」]; 錯誤:執行中斷,原因:EXC_BAD_ACCESS(代碼= 1,地址= 0x6e756f70)。 該過程已經返回到表達式評估之前的狀態。' –

4

進口的UIKit這個工作對我來說

expr @import UIKit 
+0

我也是!雖然我不知道爲什麼。 – Darren

+0

這個命令是救命的:) –

+0

你真酷,有用。 –

相關問題