How to know what function called another

后端 未结 7 1618
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-11 17:53

I wanna know if there is any way to know where the function currently in execution was called, this is, in what file and line. I\'m using C language, and I\'m looking for so

相关标签:
7条回答
  • 2021-01-11 18:24

    __FILE__, __LINE__ etc are preprocessor macros which can easily be expanded to the correct value at compile time. A function may get called from many possible places, so that can't be done via the preprocessor. Finding out the caller's name would be very difficult; it involves walking the stack and matching addresses to symbols.

    If you can live with a small hack, this might work (untested):

    /* 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)
    
    0 讨论(0)
  • 2021-01-11 18:26

    There isn't anything that is supported in all implementations that will do what you want. I have occasionally found myself in the same situation, where I needed to track callers for a few methods and did something like the following:

    #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
        ...
        ...
    

    Of course, it makes for a bit of a headache at the calling end, so you'll want to do something like:

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

    Then the call:

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

    It does the trick when all else fails.

    0 讨论(0)
  • 2021-01-11 18:30

    You can use logs .

    #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__);
    

    }

    OR

    Use bt in gdb. I call it backtrace.

    0 讨论(0)
  • 2021-01-11 18:32

    There's nothing in C itself that would give you this information. You could either trace the information yourself (upon entry/exit) or rely on platform specific APIs to walk the call stack and determine the calling function, but not much more.

    0 讨论(0)
  • 2021-01-11 18:32

    This is actually a bit more complicated to do. Your best bet is to get a backtrace on a debugger, or find something similar to pstack for your platform. The manual way would involve traversing the call stack and using debug symbols to translate that to files and lines.

    0 讨论(0)
  • 2021-01-11 18:46

    Rename your function

    void Function(param1)
    {
    }
    

    to

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

    Then #define a macro like this:

    #define Function(param1) Function_debug(param1, __FILE__, __FUNCTION__, __LINE__)
    
    0 讨论(0)
提交回复
热议问题