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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top