2018/07/20

[C] 如何反查 function 被誰呼叫

除錯時常常需要逆向追蹤程式流程,如果被呼叫的地方很少,可以直接在呼叫前 printf,但是當很多地方呼叫的時候,一個一個放 printf 似乎不是ㄧ個高效率的作法。

#define FuncName(a, b, c) \
do { \
    printf("[%s %d] called FuncName\n",__func__, __LINE__); \
    FuncNameReal (a, b, c); \
} while (0)

例如原本有個 function:
int max(int aaa, int bbb) {...}

因為不想改變呼叫的地方,所以要先把 function 名稱改成 _max

然後在 header file 裡面追加

#define max(a, b) printf("[%s %d] called max"); _max(a, b)

這樣呼叫 max 的程式就會自動報上自己是哪個 func,而且同一 func 有多的地方呼叫的話,是在哪一行呼叫也會報出來。

帶回傳值的時候
#define FuncName(a, b, c) ({ \
        int retval; \
        printf("[%s %d] called FuncName\n",__func__, __LINE__); \
        retval = FuncNameReal (a, b, c); \
        retval;})

參考來源: