如何在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
空行完成并执行代码。