Как сказать gcc, чтобы инструмент код с вызовами моей собственной функции каждый _line_ кода? - PullRequest
5 голосов
/ 21 октября 2010

Например, есть источник:

void my_special_debugging_function(const char* function_name, const char* file_name, int line_number);

void func1() {
    func3();
    func4();
}

void foo() {
    func1();
    if(qqq) {
        func2();
    };
    func3();
    func4();
    for(...) {
        func5();
    }
}

Должен компилироваться как:

void my_special_debugging_function(const char* function_name, const char* file_name, int line_number);

void func1() {
    my_special_debugging_function("func1", "prog.c", 3);
    func3();
    my_special_debugging_function("func1", "prog.c", 4);
    func4();
    my_special_debugging_function("func1", "prog.c", 5);
}

void foo() {
    my_special_debugging_function("foo", "prog.c", 8);
    func1();
    my_special_debugging_function("foo", "prog.c", 9);
    if(qqq) {
        my_special_debugging_function("foo", "prog.c", 10);
        func2();
        my_special_debugging_function("foo", "prog.c", 11);
    };
    my_special_debugging_function("foo", "prog.c", 12);
    func3();
    my_special_debugging_function("foo", "prog.c", 13);
    func4();
    my_special_debugging_function("foo", "prog.c", 14);
    for(...) {
        my_special_debugging_function("foo", "prog.c", 15);
        func5();
        my_special_debugging_function("foo", "prog.c", 16);
    }
    my_special_debugging_function("foo", "prog.c", 17);
}

Конечно, my_special_debugging_function должна иметь возможность использовать backtrace функцию.

Есть ли опция gcc, чтобы сделать это? Или есть инструмент для этого на уровне кода? (например, создать другой источник C с помощью моей функции)

@ related Как «чередовать» C / C ++ souce с моей строкой (только внутри функций в соответствующих местах)?

@ related Какой профилировщик следует использовать для измерения _реального_ времени (включая ожидание системных вызовов) в этой функции, а не _CPU_ one

Ответы [ 4 ]

4 голосов
/ 21 октября 2010

См. -finstrument-functions в документации GCC. Возможно, вы захотите использовать dladdr() в функции отладки, для чего также может потребоваться соединение с -Wl,-export-dynamic.

2 голосов
/ 19 августа 2014

Если вы используете версию gcc> = 4.5, вы можете написать плагин gcc , который обрабатывает AST так, как вам нравится. Но это решение будет зависеть от компилятора.

Вы также можете получить AST из затмения CDT и восстановить код C с этого входа.

0 голосов
/ 21 января 2016

Вы можете сделать это легко с помощью aspectc ++.Получить этот компилятор из aspectc.org Вот простой аспект, который отвечает вашим требованиям. Trace.ah

#ifndef __trace_ah__
#define __trace_ah__
#include <cstdio>
#include <iostream>
using namespace std;
template <int I> struct ArgPrinter
{
template <class JP> static inline void work (JP &tjp) {
ArgPrinter<I - 1>::work (tjp);
cout << *tjp.template arg<I - 1> () << " ";
}
};
template <> struct ArgPrinter<0>
{
 template <class JP> static inline void work (JP &tjp) {}
};


aspect trace {
int depth=-1;
pointcut virtual methods() = "% ...::%(...)";

template <class JP> void print_args (JP &tjp)
    {
         ArgPrinter<JP::ARGS>::work (tjp);
    }

advice execution (methods()) : before ()
{
    depth++;
    cout << "Enter -> " << JoinPoint::signature() <<" Depth:"<<depth<< " ARGS " << JoinPoint::ARGS <<" (";
    tjp->arg(0);
    print_args (*tjp);
    cout<<")"<<endl;
    cout<< "console--"<<endl;
}

advice execution("% ...::%(...)" && !"void ...::%(...)") : after()
{
    cout<< "--console"<<endl;
    JoinPoint::Result res = *tjp->result();
    cout << "Exit <- " << tjp->signature()<< " Depth: "<<depth<< " RET " << res<<endl;
    depth--;
}
advice execution("void ...::%(...)") : after()
{
    cout<< "--console"<<endl;
    cout << "Exit <- " << tjp->signature()<< " Depth: "<<depth<< " RET void"<<endl;
    depth--;
}
};
#endif

Скомпилируйте этот аспект с вашим проектом, используя компилятор ac ++, затем запустите вашу программу.Тогда вы должны увидеть след в консоли.Удачи!

0 голосов
/ 30 октября 2010

Как указано в другом ответе, I don't think that there is any way to tell GCC to do that, without preprocessor tricks and edits to the source code. – nategoose

...