¿Cómo decirle a gcc que instrumente el código con llamadas a mi propia función cada _línea_ de código?

Por ejemplo, existe la fuente:

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

Debe compilarse como:

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

Por supuesto, my_special_debugging_function debería poder usarbacktrace función.

¿Existe la opción de gcc para hacerlo? ¿O hay una herramienta para hacerlo a nivel de código de fuente? (por ejemplo, generar otra fuente C con mi función)

@relacionado ¿Cómo "intercalar" la fuente C / C ++ con mi cadena (solo dentro de las funciones en los lugares apropiados)?

@relacionado ¿Qué generador de perfiles debo usar para medir el tiempo real (incluida la espera de llamadas al sistema) en esta función, no en la CPU?

Respuestas a la pregunta(4)

Su respuesta a la pregunta