【问题标题】:How to know what function called another如何知道哪个函数调用了另一个函数
【发布时间】:2011-03-21 06:04:28
【问题描述】:

我想知道是否有任何方法可以知道当前正在执行的函数在哪里被调用,即在哪个文件和行中。 我正在使用 C 语言,我正在寻找类似于 __FUNCTION__、__LINE__ 或 __FILE__ 宏的东西。

【问题讨论】:

  • 您可以通过使用宏来实现。看看我的解决方案。
  • 如果您真的希望这是您可以在代码中使用的数据,这是一个不寻常的请求。你为什么要这个?也许我们可以帮助您解决引发此问题的任何问题?

标签: c file function macros line


【解决方案1】:

重命名函数

void Function(param1)
{
}

void Function_debug(param1, char * file, char * func, unsigned long line)
{
}

然后#define这样的宏:

#define Function(param1) Function_debug(param1, __FILE__, __FUNCTION__, __LINE__)

【讨论】:

  • 哦,真是一个美丽而简单的方法。非常感谢塞尔吉奥
  • 如果你真的想感谢比特,你应该点击他答案左边的复选框,说它解决了你的问题。
  • 这就是我做的,我只是当时没有点击,因为我需要10分钟来接受答案=)
【解决方案2】:

C 本身没有任何东西可以为您提供这些信息。您可以自己跟踪信息(在进入/退出时),也可以依靠平台特定的 API 来遍历调用堆栈并确定调用函数,但仅此而已。

【讨论】:

    【解决方案3】:

    __FILE____LINE__ 等是预处理器宏,可以在编译时轻松扩展为正确的值。一个函数可能会从许多可能的地方被调用,所以这不能通过预处理器来完成。找出来电者的姓名将非常困难;它涉及遍历堆栈并将地址与符号匹配。

    如果你能忍受一个小技巧,这可能会奏效(未经测试):

    /* Add a called argument to your function */
    void _myFunction(char *caller, int more_args)
    
    /* And define a macro that adds it automagically */
    #define myFunction(a) _myFunction(__FUNCTION__, a)
    

    【讨论】:

      【解决方案4】:

      在所有实现中都不支持任何您想要的东西。我偶尔会发现自己处于同样的情况,我需要跟踪调用者的一些方法并执行以下操作:

      #ifdef TRACKBACK
      int foo(int arg1, int arg2, const char * file, int line)
      {
          SEND_TO_LOG("foo", file, line);
      #else
      int foo(int arg1, int arg2)
      {
      #endif
          ...
          ...
      

      当然,这在调用端会让人有点头疼,所以你会想要做这样的事情:

      #ifdef TRACKBACK
          #define TRACKING, __FILE__, __LINE__
      #else
          #define TRACKING
      #endif
      

      然后调用:

      foo(arg1, arg2 TRACKING);  //note the lack of the comma
      

      当所有其他方法都失败时,它会起作用。

      【讨论】:

        【解决方案5】:

        如果你需要在运行时知道它,我认为这是不可能的。

        如果您需要在调试时知道它,您可以在您想要的函数上放置一个断点,然后使用 GDB(使用 bt 命令)或 Vistual Studio 的调试器,检查当前的 STACK TRACE .

        【讨论】:

          【解决方案6】:

          这实际上有点复杂。最好的办法是在调试器上进行回溯,或者为您的平台找到类似于 pstack 的内容。手动方式将涉及遍历调用堆栈并使用调试符号将其转换为文件和行。

          【讨论】:

            【解决方案7】:

            您可以使用日志。

            #define BEGIN_FUNC(X,Y,Z) printf("Function %s Entered at line %d from file %s",X,Z,Y)
            #define END_FUNC(X)  printf("Function %s Exited at line %d from file %s",X,Z,Y)
            
            foo()
            {
            BEGIN_FUNC(__func__,__FILE__,__LINE__);
            
            //Your code here
            
            
            END_FUNC(__func___FILE__,__LINE__);
            

            }

            在 gdb 中使用 bt。我称之为回溯。

            【讨论】:

              猜你喜欢
              • 2021-05-19
              • 2018-07-23
              • 1970-01-01
              • 2016-01-20
              • 2010-11-15
              • 2014-07-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多