如何在LLDBdebugging器中调用方法或执行代码?

我知道我可以键入print someFloatVariable当我设置断点或po [self someIvarHoldingAnObject] ,但我不能做有用的事情,如:

 [self setAlpha:1]; 

然后吐出来:

错误:'[self'不是一个有效的命令。

奇怪的是,我可以打电话给po [self someIvarHoldingAnObject] ,它会打印它的描述。

我相信我在一年前看过一个video,有人演示了如何在运行时通过控制台执行代码,如果我没有弄错,这个人也提供了参数和指向对象的指针。 怎么做?

gdb v。lldb命令的规范引用是http://lldb.llvm.org/lldb-gdb.html

你想使用expr命令来计算一个expression式。 这是除了参数之外还需要“原始input”的lldb命令之一,因此您经常需要用“ – ”来指示参数(到expr)结束和命令开始的位置。 例如

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

有一个快捷方式“p”,它为你做(但不允许任何参数),例如

 (lldb) p [self setAlpha:1] 

如果你调用的函数不是你的程序的一部分,你通常需要显式声明它的返回types,所以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) 

有一个干净的方法来解决浮点参数问题,顺便说一句。 你创build一个“expression式前缀”文件,将其添加到你在lldb中input的每一个expression式,以及你的类方法的原型。 例如,我有一个从NSObjectinheritance的MyClass类,它有两个感兴趣的方法,“setArg:”和“getArg”,它设置并获得一个浮动伊娃。 这是一个愚蠢的小例子,但它显示了如何使用它。 这里是我为lldb写的一个前缀文件:

 @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 *); } 

在我的~/.lldbinit文件中添加

 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库函数。 这样做后,我不需要再投入这些返回types,例如

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

(对于那个“<无结果>”的东西已经被提交给lldb TOT的来源了。)

如果你需要多行,使用expression

 expression do { try thing.save() } catch { print(error) } // code will execute now 

空行完成并执行代码。