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 gdb
führen wir etwas aus und lassen das Programm dann die Ausführung mithilfe der gdb
Befehlszeile ( 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 run
dem 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 ( .gdbinit
Datei):
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 malloc
oder 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 checkTime
die Befehlsliste in die ./gdbinit
Datei einfügen, sodass Sie sie nicht jedes Mal manuell neu definieren müssen, wenn Sie ein neues Programm ausführen.