首页
社区
课程
招聘
如何正确NSLog 两个参数block
发表于: 2022-11-27 20:35 22900

如何正确NSLog 两个参数block

2022-11-27 20:35
22900

lldb


<__NSStackBlock__: 0x16f80ec60>
<NSMethodSignature: 0x280c89320>
    number of arguments = 3
    frame size = 224
    is special struct return? NO
    return value: -------- -------- -------- --------
        type encoding (v) 'v'
        flags {}
        modifiers {}
        frame {offset = 0, offset adjust = 0, size = 0, size adjust = 0}
        memory {offset = 0, size = 0}
    argument 0: -------- -------- -------- --------
        type encoding (@) '@?'
        flags {isObject, isBlock}
        modifiers {}
        frame {offset = 0, offset adjust = 0, size = 8, size adjust = 0}
        memory {offset = 0, size = 8}
    argument 1: -------- -------- -------- --------
        type encoding (B) 'B'
        flags {}
        modifiers {}
        frame {offset = 8, offset adjust = 0, size = 8, size adjust = -7}
        memory {offset = 0, size = 1}
    argument 2: -------- -------- -------- --------
        type encoding (@) '@'
        flags {isObject}
        modifiers {}
        frame {offset = 16, offset adjust = 0, size = 8, size adjust = 0}
        memory {offset = 0, size = 8}

我理解是无返回值,一个BOOL和一个id型参数


-(void)method1:(id)arg1 method2:(id)arg2 method3:(id)arg3 method4:(void(^)(BOOL,id))arg4 {
    NSLog(@"MyHook1 \narg1:%@\narg2:%@\narg3:%@\narg4:%@\n",arg1,arg2,arg3,arg4);
    id myArg4 = ^(BOOL block_arg1, id block_arg2){
        NSLog(@"MyHook2 %@",block_arg2);
        arg4(block_arg1,block_arg2);
        NSLog(@"MyHook3 arg4 completed");
    };
    %orig(arg1,arg2,arg3,myArg4);
}

输出MyHook1 和 MyHook2就crash,这个hook应该怎样写呢?block还是没全搞懂

https://github.com/AloneMonkey/MonkeyDev/issues/125 和这个例子一模一样,而且我还试着try/catch, 以为有什么exception,没有任何输出,直接闪退/crash


难道上面的参数不对?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2022-11-28 08:21 被llau编辑 ,原因: 调整格式
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 141
活跃值: (208)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
有没有一种可能arg4 是空的, 然后你调用了,然后就crash了 ,判断非空值再调用原来的block试试
2022-12-7 13:54
0
雪    币: 167
活跃值: (3748)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

想说几点:


1. 建议试试pblock


说实话,看着 NSMethodSignature 比较晕。

建议用 chiselpblock 去打印 -》直接帮你得到翻译后的block函数的定义

举例


对于普通的block的po结果:

(lldb) po 0x000000016ee10510
<__NSStackBlock__: 0x16ee10510>
 signature: "v16@?0@"NSError"8"
 invoke   : 0x183a88410 (/System/Library/Frameworks/Accounts.framework/Accounts`<redacted>)
 copy     : 0x183a7b694 (/System/Library/Frameworks/Accounts.framework/Accounts`<redacted>)
 dispose  : 0x183a7a870 (/System/Library/Frameworks/Accounts.framework/Accounts`<redacted>)


换用pblock,可以把signature翻译成函数定义:

(lldb) pblock 0x16ee10510
Imp: 0x183a88410    Signature: void ^(NSError *);


对于函数定义:

void ^(NSError *);

就容易看清楚:

函数参数和返回值,以及每个参数的类型了


然后再去写hook代码,应该更容易


2. 把打印的 %@ 先换成 %p 试试

  • %@ 是打印 (ObjC的)对象,万一不是对象,或者是其他变量类型,就容易报错,甚至crash

  • 先换成:%p,只是以pointer指针打印,确保不会crash

->确保参数个数正常了,再去挨个换成%@,看看是哪个参数导致的崩溃


2023-2-24 10:50
0
游客
登录 | 注册 方可回帖
返回
//