wie kann ich in GDB einen Haltepunkt auf „an das Terminal etwas gedruckt wird“ setzen?
-
20-09-2019 - |
Frage
Ich möchte von wissen, wo innerhalb eines großen Anwendung eine bestimmte Nachricht gedruckt wird. Die Anwendung ist so groß und alt, dass es alle denkbaren Möglichkeiten, Drucken von Text auf dem Terminal verwendet; zum Beispiel printf (), fprintf (stdout, ...) etc.
Ich schreibe über die write () Systemaufruf einen Haltepunkt zu setzen, aber dann bin ich mit zu vielen Breakpoint überflutet stoppt wegen der verschiedenen Datei-I / O-Operationen, die Verwendung write () als auch.
Also im Grunde mag ich gdb zu stoppen, wenn das Programm druckt etwas zum Terminal aber zugleich I gdb nicht aufhören will, wenn das Programm etwas in eine Datei schreibt.
Lösung
Verwenden Sie einen bedingten Haltepunkt, dass die Kontrollen der erste Parameter. Auf 64-Bit-x86-Systemen würde die Bedingung sein:
(GDB) b schreiben, wenn 1 == $ rdi
Auf 32-Bit-Systemen ist es komplizierter, weil der Parameter auf dem Stapel ist, was bedeutet, dass Sie der fd Parameter $ esp in einen int * und Index werfen müssen. Der Stapel an diesem Punkt hat die Absenderadresse, die Länge, Puffer und schließlich fd.
Dies variiert stark zwischen den Hardware-Plattformen.
Andere Tipps
Mit GDB 7.0 können Sie bedingten Haltepunkt auf SYSCALL Schreib gesetzt ():
(gdb) catch syscall write
Catchpoint 1 (syscall 'write' [4])
(gdb) condition 1 $ebx==1
$ ebx enthält erste syscall Parameter - FD Nummer hier