Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to tell gcc to instrument the code with calls to my own function each _line_ of code?

For example, there is the source:

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();
    }
}

It should compile as:

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);
}

Of course, my_special_debugging_function should be able to use backtrace function.

Is there option of gcc to do it? Or is there a tool to do it at souce code level? (e.g. generate other C souce with my function)

@related How to "interleave" C/C++ souce with my string (only inside functions at appropriate places)?

@related What profiler should I use to measure _real_ time (including waiting for syscalls) spend in this function, not _CPU_ one

like image 292
Vi. Avatar asked Oct 20 '10 22:10

Vi.


2 Answers

See -finstrument-functions in the GCC documentation. You may want to use dladdr() in the debugging function, which may also require linking with -Wl,-export-dynamic.

like image 170
jilles Avatar answered Sep 22 '22 08:09

jilles


If you are using a gcc version >=4.5 you can write a gcc plugin that processes the AST in the way you like. But that solution would be compiler dependent.

You can also obtain AST from eclipse CDT and regenerate C code from that input.

like image 24
Aykut Kllic Avatar answered Sep 19 '22 08:09

Aykut Kllic