我在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
我也试过调用,但显然这不是llvm中的命令?它在gdb中可用。
(lldb) call (void)0x2c7140(NO, @"Test")
error: 'call' is not a valid command.
我刚才意识到,无论如何第一次尝试都会失败,因为po无法使用void返回值,但问题仍然存在......
答案 0 :(得分: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")
其中$n
是第一个表达式结果的标识符,它将是lldb输出的一部分。我相信您可以简单地使用$
来表示“之前的结果”,但尚未对此进行测试。