2016-05-09 5 views
3

Ich habe eine C-Binärdatei (Quellcode verfügbar) und eine vordefinierte Auslastung. Ich möchte alle Funktionsaufrufe und ihre jeweiligen Parameter sowie den Rückgabewert in Abrufreihenfolge protokollieren. Zum Beispiel in dem unten stehenden Code:Protokollieren Sie alle Parameterwerte von jedem C-Funktionsaufruf

int myfunc(int value){ 
    return value*2; 
} 

int main(void){ 
    int i; 
    i = myfunc(10); 
    i = myfunc(12); 
    i = myfunc(20); 
    return 0; 
} 

Es shoud in einer Log-Datei wie folgt ergeben:

int main() 
int myfunc(10) 
myfunc return 20 
int myfunc(12) 
myfunc return 24 
int myfunc(21) 
myfunc return 42 
main return 0 

Ich habe bereits versucht Intel PIN zu verwenden, es zu tun, und es funktioniert sehr gut , außer wenn die Variable ein Zeiger, ein Array, eine Struktur oder ein Typdef ist. Ich brauche alle Variablen.

Ich habe den Quellcode und ich kann es mit Debug-Optionen kompilieren.

Irgendwelche Ideen?

P.S. manuell zu debuggen, ist nicht durchführbar, da meine tatsächliche Arbeitslast etwa 5000 Aufrufe von 90 verschiedenen Funktionen hat.

Edit: OS ist Arch Linux 64bit

+0

Eine Option ist [Systemtap] (https://sourceware.org/systemtap/). Sie haben Ihr Betriebssystem nicht angegeben, aber Systemtap ist für Linux. – kaylum

+0

Tks @ kaylum, Ich werde Systemtap versuchen und hier posten, wenn es funktioniert. – William

Antwort

5

Sie gdb verwenden können, Funktionsaufrufe und die zurückgegebenen Werte mit Breakpoints 'Ereignisse' zur Laufzeit verfolgen: mein Ansatz

(gdb) help command 
Set commands to be executed when a breakpoint is hit. 
Give breakpoint number as argument after "commands". 
With no argument, the targeted breakpoint is the last one set. 
The commands themselves follow starting on the next line. 
Type a line containing "end" to indicate the end of them. 
Give "silent" as the first line to make the breakpoint silent; 
then no output is printed when it is hit, except what the commands print. 

Check out:

Quellcode:

int myfunc(int n) 
{ 
    int val = n * 2; 

    return val; 
} 

int main(void) 
{ 
    int i; 

    i = myfunc(10); 
    i = myfunc(12); 
    i = myfunc(20); 

    return 0; 
} 

1) Kompilieren yo ur-Programm im Debug-Modus mit -g Option:

$ gcc -g program.c -o program 

2) Führen Sie gdb:

$ gdb ./program 

3) In gdb Shell können Sie Grenzwerte für jede Funktion und/oder Linien, die Sie verfolgen möchten gesetzt:

(gdb) break myfunc 
Breakpoint 1 at 0x4011d6: file program.c, line 3. 

(gdb) break program.c:5 
Breakpoint 2 at 0x4011de: file program.c, line 5. 

4) Stellen Sie schweigt Unterbrechungsereignisse die silent Befehl:

(gdb) command 1 
Type commands for breakpoint(s) 1, one per line. 
End with a line saying just "end". 
>silent 
>printf "calling myfunc(%d)\n", n 
>cont 
>end 

(gdb) command 2 
Type commands for breakpoint(s) 2, one per line. 
End with a line saying just "end". 
>silent 
>printf "myfunc return %d\n", val 
>cont 
>end 

5) Führen Sie das Programm:

(gdb) run 
Starting program: /home/Administrator/program 
[New Thread 192.0xe00] 
[New Thread 192.0x55c] 
calling myfunc(10) 
myfunc return 20 
calling myfunc(12) 
myfunc return 24 
calling myfunc(20) 
myfunc return 40 
[Inferior 1 (process 192) exited normally] 

Obs: gdb liest eine Skriptdatei namens .gdbinit, wenn sie aufgerufen. Diese Datei enthält gdb Befehle, die während gdb Start automatisch ausgeführt werden und können verwendet werden, um Debug-Vorgänge zu automatisieren.

Hoffe es hilft!

+0

Danke Lacobus. Ich werde @kalyum Vorschlag zuerst versuchen. Ich vermeide Debuggen, weil das Eindringen sehr groß ist.Es ist nicht obligatorisch, aber es ist gut, wenn ich etwas mit geringem Eindringen verwenden kann. Aber mein PhD-Sponsor wird gerne sehen, dass es zwei neue Möglichkeiten gibt. – William

+0

Sorry @William, aber ich kenne keine andere Methode weniger aufdringlich als 'gdb'. – Lacobus

+0

Btw, haben Sie nach einem Werkzeug namens "strace" gesucht? Es wird verwendet, um Interaktionen zwischen Prozessen und dem Linux-Kernel zu überwachen, einschließlich Systemaufrufen, Signallieferungen und Änderungen des Prozessstatus. Vielleicht ein gutes Thema für Ihre Doktorarbeit. – Lacobus

Verwandte Themen