Objective c 如何从lldb执行块(由指针标识)
我在iOS模拟器中的lldb调试器中,我有一个块的地址。我想尝试执行它。我尝试了想到的第一件事(见下文),但没有成功。有办法做到这一点吗Objective c 如何从lldb执行块(由指针标识),objective-c,objective-c-blocks,lldb,Objective C,Objective C Blocks,Lldb,我在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 我刚刚意
(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
我刚刚意识到,第一次尝试无论如何都会失败,因为po不会使用无效返回值,但问题仍然存在…您需要将数字转换为块指针
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")
其中,
$n
是给定给第一个表达式结果的标识符,它将是lldb输出的一部分。我相信您可以简单地使用$
来表示“以前的结果”,但尚未测试此结果。我现在无法完全测试此结果。尝试它会给我:错误:块支持已禁用-使用-fblock编译或选择支持它们的部署目标。不过,这似乎是向前迈出的一步。我会继续给牦牛刮胡子,所以我也没试过。我认为这是因为我试图连接到一个正在运行的进程,但可能这个版本的lldb不支持执行块。
expr (void (^)(BOOL,NSString*))0x2c7140
expr $n(NO, @"Test")