【问题标题】:How to find out who is the caller of a method or function? [duplicate]如何找出方法或函数的调用者是谁? [复制]
【发布时间】:2010-11-25 07:56:02
【问题描述】:

我想编写一个调试函数或方法来帮助打印有用的信息。当它被调用时,我需要:

  • 调用对象的内存地址(如果被对象调用)
  • 调用者的方法签名(或方法名),或函数名
  • 拥有该方法或函数的类名

是否有可能在不传递一大堆参数的情况下获取这些信息?

我想做类似的东西:

debug();

然后进入每个方法和功能,并帮助打印出有关正在发生的事情的有用信息。

【问题讨论】:

    标签: objective-c cocoa debugging methods program-flow


    【解决方案1】:

    您可以使用backtrace(3) API 找出调用您的方法或函数。但是,获取调用对象(如果有的话)要困难得多。

    【讨论】:

    • 我试过了,但是 backtrace(3) 似乎不可用?
    • #include <execinfo.h>了吗?
    【解决方案2】:

    抱歉,我没有完整的答案,只有一些相关信息。

    NSThread 定义了一个方法,可以让你获得一个非符号化的回溯,callStackReturnAddresses。在 10.6 中,它还会为您提供满足您的第二个和第三个请求 callStackSymbols 的字符串。

    获取调用对象的地址很有趣,但并不完全简单。这将涉及在堆栈中向上走并挑选接收器对象通常存储的位置如果它存储在 ARM 上的通常位置。为此,您(或某人)需要了解 ARM 的调用约定,这些约定可能记录在某处的 ARM ABI(应用程序二进制接口)中。我不知道ARM。这在 i386 上是可行的,而不是在 ppc 上。

    【讨论】:

    • 当然,ARM 仅适用于他的目标是 iPhone 而不是 Mac。
    • 嗯。我可以发誓之前提到过 iPhone 的问题。
    • 你是对的。它最初带有 iphone、uikit 和 cocoa-touch 标签,在 Quinn Taylor 用调试、程序流和方法替换它们之前:stackoverflow.com/revisions/1373991/list 抱歉造成混淆。
    【解决方案3】:

    我使用 Karl Kraft 的DebugLog

    【讨论】:

      【解决方案4】:
      1. 在您有兴趣调试的方法上设置symbolic breakpoint
      2. 如果您需要在堆栈中向上移动(以查看方法调用的来源),您可以使用 Xcode 调试器,或者如果您想自动化它,请使用backtrace n 在堆栈中向上移动n 帧数。

      【讨论】:

        【解决方案5】:

        我的第一反应是建议使用gdb 和断点,因为大部分信息都可以在堆栈跟踪中找到。但是,如果您真的想看到它被打印出来,有一些方法可以近似您在说什么

        预处理器识别出用于打印函数/方法名称的 __PRETTY_FUNCTION__ 宏,它适用于 Objective-C 方法。如果您在每个感兴趣的方法上打印方法名称和 self 的值,您几乎已经生成了一个穷人的堆栈跟踪。

        尝试在每个需要它的文件的标题中包含这样的 #define

        #define METHOD() printf("%s\t0x%x\n", __PRETTY_FUNCTION__, (unsigned int)self)
        

        然后,只要您想打印该信息,只需包含此行:

        METHOD();
        

        输出将如下所示:

        -[MyClass initWithFoo:bar:] 0x12345678
        

        正如我所提到的,这种方法很可能会产生大量的输出,而 gdb 可能是一个更务实的选择。

        【讨论】:

          猜你喜欢
          • 2014-01-09
          • 2010-09-21
          • 1970-01-01
          • 1970-01-01
          • 2021-04-13
          • 1970-01-01
          • 1970-01-01
          • 2017-03-25
          相关资源
          最近更新 更多