请教一个逆向中如何判断block回调的问题

最近刚看完《iOS应用逆向工程》这本书,想尝试逆向别人的一个功能,通过打印堆栈信息,
看到如下调用堆栈
1.方法f
2.方法a_block
3.方法b_block
4.方法c_block
5.方法d
6.方法c
7.方法b
8.方法a
然后自己就分不清楚,方法a到方法f是如何调用的
自己写了一个demo,打印了类似的堆栈信息

0x00000001000016dd __57-[AppDelegate application:didFinishLaunchingWithOptions:]_block_invoke_2 + 77
0x0000000100001b70 -[AppDelegate testMethods4:] + 112
0x0000000100001673 __57-[AppDelegate application:didFinishLaunchingWithOptions:]_block_invoke + 131
0x000000010000194e __28-[AppDelegate testMethods1:]_block_invoke + 206
0x0000000100001ad0 -[AppDelegate testMethods3:] + 112
0x0000000100001a3f -[AppDelegate testMethods2:] + 95
0x0000000100001848 -[AppDelegate testMethods1:] + 168
0x000000010000158e -[AppDelegate application:didFinishLaunchingWithOptions:] + 190


IDA下methods4的截图

在这种情况下,如何区分这几个方法的调用关系?
请大牛们指导

感谢

我记得自己在调试的时候,从堆栈里看不出太多有用信息,类似于“方法a到方法f是如何调用的”这种问题,我觉得最好的方式就是IDA和lldb配合调试。你可以把你写的这段源代码贴上来,我对照着IDA这张截图看看,然后分析一下block是怎么得到调用的

嗯嗯,好的
下面是整个测试代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    [self testMethods1:^(bool bResult, NSNumber *num) {
        
        [self testMethods4:^(bool bResult, NSNumber *num) {
            
            NSLog(@"4 - back track is:%@", [NSThread callStackSymbols]);
        }];
        
    }];
    
    NSLog(@"end");

    return YES;
}

- (void)testMethods1:(void(^)(bool bResult , NSNumber * num))block
{
    [self testMethods2:^(bool bResult , NSNumber * num){
        
        block(bResult, num);
    }];
    
}

- (void)testMethods2:(void(^)(bool bResult , NSNumber * num))block
{
    [self testMethods3:block];
}

- (void)testMethods3:(void(^)(bool bResult , NSNumber * num))block
{
    block(YES, @(2));
}

- (void)testMethods4:(void(^)(bool bResult , NSNumber * num))block
{
    block(YES, @(555));
}

下面是二进制文件
blockTest.zip (9.34 KB)

你的testMethod4内就调用了一个block(),也谈不上什么调用关系,我估计就是这俩BLX R3中的其中一个,这种情况你需要动态调试了,再这2个BLX上下断点,然后si,看看到底跳到哪里去执行了。
要看调用关系的话,根据你的源代码,testMethod2倒是比较适合作为查看调用关系的例子

明白了,今天下午已经在挂GDB进行跟进了,非常感谢非常感谢~