我知道我可以print someFloatVariable在设置断点时键入po [self someIvarHoldingAnObject],但是我不能做有用的事情,比如:
[self setAlpha:1];
Run Code Online (Sandbox Code Playgroud)
然后吐出来:
错误:'[self'不是有效的命令.
奇怪的是我可以打电话po [self someIvarHoldingAnObject],它将打印出它的描述.
我相信我在一年前看过一个视频,其中有人演示了如何在运行时通过控制台执行代码,如果我没有弄错,这个人也提供了参数并为指针分配了对象.怎么做?
Jas*_*nda 105
gdb v.lldb命令的规范参考是http://lldb.llvm.org/lldb-gdb.html
您想使用expr命令来计算表达式.它是lldb命令之一,除了参数之外还带有"原始输入",所以你经常需要一个" - "来表示参数(到expr)结束和命令开始的位置.例如
(lldb) expr -- [self setAlpha:1]
Run Code Online (Sandbox Code Playgroud)
有一个快捷方式"p",它为你做(但不允许任何参数),例如
(lldb) p [self setAlpha:1]
Run Code Online (Sandbox Code Playgroud)
如果您调用的函数不是程序的一部分,您通常需要显式声明它们的返回类型,以便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)
Run Code Online (Sandbox Code Playgroud)
有一种巧妙的解决浮点参数问题的方法,BTW.您创建一个"表达式前缀"文件,该文件将添加到您在lldb中输入的每个表达式中,并带有类方法的原型.例如,我有一个继承自NSObject的类MyClass,它有两个感兴趣的方法,"setArg:"和"getArg"设置并获得一个浮动ivar.这是一个愚蠢的小例子,但它显示了如何使用它.这是我为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 *);
}
Run Code Online (Sandbox Code Playgroud)
在我的~/.lldbinit文件中我添加
settings set target.expr-prefix /Users/jason/lldb-prefix.h
Run Code Online (Sandbox Code Playgroud)
现在我能做到
(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
Run Code Online (Sandbox Code Playgroud)
您会注意到我在这里也包含了几个标准C库函数.执行此操作后,我不再需要转换这些类型的返回类型,例如
(lldb) p printf("HI\n")
<no result>
HI
(lldb) p strcmp ("HI", "THERE")
(int) $3 = -12
Run Code Online (Sandbox Code Playgroud)
(修复了那个"<no result>"的东西已经提交给lldb TOT源了.)
如果需要多行,请使用expression:
expression
do {
try thing.save()
} catch {
print(error)
}
// code will execute now
Run Code Online (Sandbox Code Playgroud)
空行以完成并执行代码。
| 归档时间: |
|
| 查看次数: |
42290 次 |
| 最近记录: |