Verstrichene Zeit in GDB

Verstrichene Zeit in GDB

Gibt es eine Möglichkeit, die verstrichene Zeit zu messen, unter der das Programm ausgeführt wird gdb?

Schauen Sie sich das an:

<------------bp---------------------------------->

Angenommen, wir debuggen eine Datei und setzen an einer beliebigen Stelle einen Haltepunkt. Jetzt gdbführen wir etwas aus und lassen das Programm dann die Ausführung mithilfe der gdbBefehlszeile ( run) fortsetzen.

Meine Frage ist hier. Ich möchte die verstrichene Zeit messen von derBlutdruckbis das Programm entweder erfolgreich beendet wird oder ein Fehler auftritt.

Mein Vorschlag ist, eine Datei zu verwenden .gdbinit. In dieser Datei rufen wir eine C-Funktion auf, um den Zeitgeber nach rundem Befehl zu starten. Am Ende der Ausführung rufen wir außerdem eine gettime()C-Funktion auf.

Mein Pseudocode sieht also ungefähr so ​​aus ( .gdbinitDatei):

break *0x8048452 (random place)
//start time
run
//get time

Antwort1

Der einfachste Weg, dies zu tun (wenn Ihr GDB Python-Unterstützung hat):

break *0xaddress
run
# target process is now stopped at breakpoint
python import time
python starttime=time.time()
continue
python print (time.time()-starttime)

Wenn Ihr GDB keine Python-Unterstützung hat, aber Shell-Befehle ausführen kann, verwenden Sie Folgendes:

shell echo set \$starttime=$(date +%s.%N) > ~/gdbtmp
source ~/gdbtmp
continue
shell echo print $(date +%s.%N)-\$starttime > ~/gdbtmp
source ~/gdbtmp

Alternativ können Sie den Zielprozess aufrufen lassengettimeofdayoderclock_gettime, aber das ist viel mühsamer. Diese Funktionen geben die Zeit zurück, indem sie in Variablen im Adressraum des Prozesses schreiben, die Sie wahrscheinlich durch den Aufruf von etwas wie zuweisen müssten malloc, und das funktioniert möglicherweise nicht, wenn Ihr Haltepunkt das Programm mitten in einem Aufruf eines anderen mallocoder gestoppt hat free.

Ein kleines Problem bei dieser Lösung besteht jedoch darin, dass die Zeilen „continue“ und „print result“ direkt nacheinander ausgeführt werden müssen, da sonst die Zeitangabe ungenau ist. Wir können dies lösen, indem wir die Befehle über „define“ in ein vorgefertigtes Skript einfügen. Wenn wir ausführen define checkTime, fordert uns gdb auf, eine Liste mit Befehlen einzugeben. Geben Sie einfach eine der oben stehenden Befehlslisten ein (Python/Shell), und rufen Sie das Skript dann einfach mit dem Befehl auf checkTime. Dann ist die Zeitangabe genau. Darüber hinaus können Sie define checkTimedie Befehlsliste in die ./gdbinitDatei einfügen, sodass Sie sie nicht jedes Mal manuell neu definieren müssen, wenn Sie ein neues Programm ausführen.

verwandte Informationen