为了账号安全,请及时绑定邮箱和手机立即绑定

如何找出谁叫方法?

/ 猿问

如何找出谁叫方法?

呼如林 2019-10-21 15:18:05

示例:当我的方法-fooBar被调用时,我希望它在控制台中登录哪个其他类的另一个方法调用它。


现在,我只知道如何使用以下命令记录fooBar本身及其类的方法名称:


_cmd


[self class]

这可能找出来吗?


查看完整描述

3 回答

?
守着一只汪

在完全优化的代码中,没有100%确定方法来确定特定方法的调用方。编译器可以采用尾部调用优化,而编译器可以为被调用者有效地重新使用调用者的堆栈帧。

要查看此示例,请使用gdb在任何给定方法上设置一个断点,然后查看回溯。请注意,在每个方法调用之前,您不会看到objc_msgSend()。这是因为objc_msgSend()对每个方法的实现进行尾部调用。

尽管您可以对应用程序进行非优化的编译,但是您需要所有系统库的非优化版本来避免这一问题。

这只是一个问题。实际上,您在问“我如何重新发明CrashTracer或gdb?”。从事职业的一个非常困难的问题。除非您希望“调试工具”成为您的职业,否则我建议您不要走这条路。

您真正要回答什么问题?


查看完整回答
反对 回复 2019-10-21
?
紫衣仙女

怎么样这个:


NSString *sourceString = [[NSThread callStackSymbols] objectAtIndex:1];


NSCharacterSet *separatorSet = [NSCharacterSet characterSetWithCharactersInString:@" -[]+?.,"];

NSMutableArray *array = [NSMutableArray arrayWithArray:[sourceString  componentsSeparatedByCharactersInSet:separatorSet]];

[array removeObject:@""];


NSLog(@"Class caller = %@", [array objectAtIndex:3]);

NSLog(@"Method caller = %@", [array objectAtIndex:4]);


查看完整回答
反对 回复 2019-10-21
?
LEATH

用户以下方法 

通行证指数要显示方法和传递-1,如果你想显示方法的全栈


+(void) methodAtIndex:(int)index{

    void* callstack[128];

    int frames = backtrace(callstack, 128);

    char** strs = backtrace_symbols(callstack, frames);


    if (index == -1) {

        for (int i = 0; i < frames; ++i) {

            printf("%s\n", strs[i]);

        }

    }

    else {

        if (index < frames) {

            printf("%s\n", strs[index]);

        }

    }

    free(strs);


}


查看完整回答
反对 回复 2019-10-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信