如何从lldb执行块(由指针标识)

Dav*_*uma 3 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
Run Code Online (Sandbox Code Playgroud)

我也试过电话,但显然这不是llvm的命令?它在gdb中可用.

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

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

ugh*_*fhw 10

您需要将数字转换为块指针.

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

(expr是lldb的替代品call)

我实际上没有测试过这个有效,但已经确认lldb会识别出演员.您可能需要将其拆分为两个expr命令,一个用于执行转换,另一个用于执行调用:

expr (void (^)(BOOL,NSString*))0x2c7140
expr $n(NO, @"Test")
Run Code Online (Sandbox Code Playgroud)

其中$n是第一个表达式结果的标识符,它将是lldb输出的一部分.我相信你可以简单地$用来表示"以前的结果",但没有测试过.