2013-07-11 4 views
1

Я хочу реализовать код отладки для моего проекта, который находится в c. В моем проекте у меня так много функций и вызовов функций. Я хочу написать код таким образом, что при вызове функции он должен печатать имя функции и имя вызывающего. Может ли кто-нибудь дать мне ключ к этому?Как узнать вызывающего абонента функции

+1

Похоже, вы хотите StackTrace. Хотя это, безусловно, возможно написать такой код, также, безусловно, проще использовать отладчик, чтобы сказать вам. Есть ли причина, которая не сработает? – FatalError

+0

Если вы используете GCC, вы можете взять адрес, возвращенный '__builtin_return_address', и сделать некоторые умные трюки, чтобы разрешить им имена функций. – tangrs

ответ

5

Библиотека libunwind может вам помочь. Но это будет довольно медленно и может дать очень непредсказуемые результаты в случае оптимизированных двоичных файлов.

Вам действительно нужно реализовать это в приложении? Не работает ли приложение под gdb с некоторыми точками останова?

Другой способ генерации трассировок без большой зависимости - это просто переместить некоторые вызовы функций в макрос вроде этого (очень тривиальное решение, оно может сделать больше).

#define TRACE(s) { printf("Doing %s\n", #s); s; } 
0

Вы могли бы реализовать макрос для вас функций, которые отображают звонящим, если в режиме отладки

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define DEBUG_MODE 

#ifdef DEBUG_MODE 
    int test(int , const char *) ; 
#else 
    int test(int) ; 
#endif 

#ifdef DEBUG_MODE 
    int test(int n , const char * c) 
    { 
     printf("current: %s caller: %s\n" , __func__ , c) ; 

     return n + 123 ; 
    } 
    #define test(n) test(n,__func__) 

#else 
    int test(int n) 
    { 
     return n + 123 ; 
    } 
#endif 


int main(void) 
{ 
    int n = test(3) ; 

    printf("result: %d\n" , n) ; 

    return 0; 
} 
Смежные вопросы