2012-10-10 33 views
54

我知道我可以鍵入print someFloatVariable當我設置一個斷點或po [self someIvarHoldingAnObject],但我不能做有用的事情,如:如何在LLDB調試器中調用方法或執行代碼?

[self setAlpha:1]; 

然後吐出:

error: '[self' is not a valid command.

奇怪的是,我可以調用po [self someIvarHoldingAnObject]它會打印出它的描述。

我相信我已經看到了視頻一年前如果有人演示瞭如何通過控制檯在運行時執行代碼,如果我沒有記錯這傢伙還提供參數和分配對象的指針。怎麼做?

+0

有[在LLDB換GDB-​​users.txt](http://opensource.apple.com/source/lldb/lldb-69/docs/lldb-for-gdb-users一個例子。txt)for C:'expr(int)printf(「...」)'。也許你應該用'expr(type)'''方法調用前綴? – osgx

回答

85

爲GDB訴LLDB命令中的標準基準是http://lldb.llvm.org/lldb-gdb.html

你想使用的計算表達式expr命令。它是採用「原始輸入」除了參數的LLDB命令之一,所以你經常需要用「 - 」表示,其中參數(以表達式)結束和指令(S)開始。例如

(lldb) expr -- [self setAlpha:1] 

有一個快捷方式「p」,它爲你做了(但不允許任何參數),例如,

(lldb) p [self setAlpha:1] 

如果你調用的功能(S)是不是你的計劃的一部分,你會經常需要這麼LLDB知道如何稱呼他們明確聲明他們的返回類型。例如

(lldb) p printf("hi\n") 
error: 'printf' has unknown return type; cast the call to its declared return type 
error: 1 errors parsing expression 
(lldb) p (int)printf("hi\n") 
(int) $0 = 3 
hi 
(lldb) 

有一種整潔的方法來解決浮點參數問題,順便說一句。創建被添加到您的LLDB輸入的每一個表情,與原型的類方法「表達前綴」文件。舉例來說,我有一個MyClass類從NSObject的繼承,它有兩個感興趣的方法,「setArg:」和「GETARG」,確定,並得到一個浮動伊娃。這是一個愚蠢的小例子,但它顯示瞭如何使用它。下面是我對LLDB寫了一個前綴的文件:在我~/.lldbinit文件

@interface NSObject 
@end 
@interface MyClass : NSObject 
- init; 
- setArg: (float)arg; 
- (float) getArg; 
@end 

extern "C" { 
    int strcmp (const char *, const char *); 
    int printf(const char * __restrict, ...); 
    void puts (const char *); 
} 

我添加

settings set target.expr-prefix /Users/jason/lldb-prefix.h 

,現在我能做的

(lldb) p [var getArg] 
(float) $0 = 0.5 
(lldb) p [var setArg:0.7] 
(id) $1 = 0x0000000100104740 
(lldb) p [var getArg] 
(float) $2 = 0.7 

你會發現我包括一對夫婦標準的C庫函數也在這裏。做完這些之後,我不需要再投射這些返回類型,例如

(lldb) p printf("HI\n") 
<no result> 
HI 
(lldb) p strcmp ("HI", "THERE") 
(int) $3 = -12 

(爲 「<沒有結果>」 的事情一直致力於LLDB TOT源已修復)

+0

expr - [self setAlpha:0.5f]或expr - [self setAlpha:1]都會使有問題的視圖從屏幕上完全消失。似乎發生了一些事情,但絕對不是正確的事情。我只能在設置斷點時輸入這些命令。還是有辦法做到這樣的事情,而代碼仍然運行/未暫停? –

+0

不,您需要在您調用此方法時停止該進程。如果這個選擇器採用浮點類型,那麼你可能會用Xcode 4.5的lldb命中一個缺點 - 如果函數參數採用浮點類型並且沒有調試信息,lldb不會給你任何方式以浮點形式傳遞該值。它將無條件地將它作爲一個雙精度傳遞,遵循舊的C語言無原型參數提升規則。如果lldb有這個類的調試信息,它應該能夠做正確的事情。 ObjC編程中的這個問題的許多實例將在未來的版本中修復。 –

+0

注意:如果你遇到的問題是float float v。double,那麼你傳遞給你的setAlpha的值不會是你所期望的,它會是一些隨機的瘋狂數字,可能非常接近0,例如。 –

2

如果你需要多行,使用expression

expression 

do { 
    try thing.save() 
} catch { 
    print(error) 
} 

// code will execute now 

空白行來完成並執行代碼。