gpt4 book ai didi

xcode - 如何在LLDB调试器中调用方法或执行代码?

转载 作者:行者123 更新时间:2023-12-02 23:48:48 27 4
gpt4 key购买 nike

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

[self setAlpha:1];

然后它吐出:

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

奇怪的是,我可以调用 po [self someIvarHoldingAnObject] 并且它会打印它的描述。

我相信我一年前看过一个视频,其中有人演示了如何在运行时通过控制台执行代码,如果我没记错的话,这个人还提供了参数并将对象分配给指针。如何做到这一点?

最佳答案

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

您想要使用 expr 命令来计算表达式。它是除了参数之外还接受“原始输入”的 lldb 命令之一,因此您经常需要一个“--”来指示参数(到 expr)结束和命令开始的位置。例如

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

有一个快捷方式“p”,它可以为您执行 -- 操作(但不允许任何参数),例如

(lldb) p [self setAlpha:1]

如果您调用的函数不是程序的一部分,您通常需要显式声明它们的返回类型,以便 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 中输入的每个表达式中,并带有类方法的原型(prototype)。例如,我有一个继承自 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 *);
}

在我的 ~/.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 库函数。完成此操作后,我不需要再转换这些返回类型,例如

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

(“<无结果>”问题的修复已提交给 lldb TOT 源。)

关于xcode - 如何在LLDB调试器中调用方法或执行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12829665/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com