3

我在 iOS 模拟器中的 lldb 调试器中,我有一个块的地址。我想尝试执行它。我尝试了想到的第一件事(见下文),但没有奏效。有没有办法做到这一点?

(lldb) po 0x2c7140
(int) $2 = 2912576 <__NSGlobalBlock__: 0x2c7140>
(lldb) po 0x2c7140(NO, @"Test")
error: called object type 'int' is not a function or function pointer

我也试过call但显然这不是 llvm 中的命令?它在 gdb 中可用。

(lldb) call (void)0x2c7140(NO, @"Test")
error: 'call' is not a valid command.

我刚刚意识到第一次尝试无论如何都会失败,因为 po 不会使用 void 返回值,但问题仍然存在......

4

1 回答 1

10

您需要将您的号码转换为块指针。

expr ((void (^)(BOOL,NSString*))0x2c7140)(NO, @"Test")
       |        |    |          |        |
  Return type  Argument types  Address  Call

expr是 lldb 的替代品call

我还没有实际测试过这是否有效,但已经确认 lldb 可以识别演员表。您可能需要将其拆分为两个expr命令,一个用于强制转换,一个用于调用:

expr (void (^)(BOOL,NSString*))0x2c7140
expr $n(NO, @"Test")

where$n是赋予第一个表达式的结果的标识符,它将成为 lldb 输出的一部分。我相信您可以简单地使用$来表示“先前的结果”,但尚未对此进行测试。

于 2012-04-24T23:43:47.957 回答