2012-10-10 91 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 

空白行来完成并执行代码。