2012-11-16 12 views
9

Gibt es eine Möglichkeit, einen Haltepunkt an jeder Zeile im Code mit GDB zu setzen? Offensichtlich möchte ich nicht für jede einzelne Zeile b *addr treffen, also frage ich mich, ob es einen schnellen Weg gibt, dies zu tun.Haltepunkt auf jeder Zeile in GDB setzen

Bearbeiten Beachten Sie, dass ich eine Binärdatei ausführen, die von jemand anderem erstellt wurde, und ich habe keinen Zugriff auf den Quellcode. Leider wurde diese Binärdatei nicht mit dem Flag -g kompiliert. Daher kann ich nicht einfach jede Zeile im Code durchlaufen.

Weitere bearbeiten Wie Jason Punkte unten auf, Sie können in der Tat einzigen Schritt durch den Code so lange, wie Sie verwenden si oder ni, als nur einfach s (Schritt) oder n (nächste) gegenüber. obwohl n oder s gut funktionieren, wenn der Quellcode mit -g kompiliert worden ist, aber es tritt durch die Leitungen des Quellcodes, im Gegensatz zu Schritt durch jede Montageanleitung wie ni oder si in einem binären tun, die ohne -g kompiliert wurde .

+0

Was Sie bei jedem Schritt zu tun? Für "liste": http://stackoverflow.com/questions/4362581/get-gdb-to-do-a-list-after-every-step –

Antwort

7

Verwenden Sie si (stepi) für den Anweisungsschritt durch den Code. Sie können ni (nexti) verwenden, um Bibliotheksfunktionen zu überspringen, an denen Sie nicht interessiert sind. Wenn Sie versehentlich in einen von ihnen eintreten, sollte finish Sie zu Ihrer ursprünglichen Routine zurückbringen. Leute, die auf dieser Ebene arbeiten, haben typischerweise gdb eingestellt, um die nächsten wenigen Befehle anzuzeigen, die ausgeführt werden sollen, z. disp/3i $pc.

+0

Wow, so eine einfache Lösung. Ich benutzte n und s anstelle von ni oder si. Funktioniert perfekt. Ich bin gespannt, wie GDB ni vs n interpretiert. Auch disp/3i $ pc ist enorm hilfreich. – smaccoun

+1

'next' verwendet die Quellzeileninformationen aus den Debug-Informationen, um den Adressbereich einer Quellzeile zu bestimmen. Zeile 10 könnte von 0x100 nach 0x116 gehen, also führt der Debugger (hinter den Kulissen) jede Anweisung aus, bis der pc 0x116 ist. Zu den Komplikationen gehören das Wechseln in eine andere Funktion oder das Verlassen der aktuellen Funktion (return command, longjmp, Ausnahme ausgelöst). In diesem Fall müssen Sie die Ausführung stoppen. Wenn der Debugger in einen Unterroutinenaufruf eintritt, legt er einen Haltepunkt für die ursprüngliche Funktion fest und fährt fort. Hinter den Kulissen passiert viel. 'ni' ist niedrigeres Niveau. –

1

Können Sie nicht einfach den Haltepunkt in der ersten Zeile der Ausführung platzieren und dann durch jede Zeile gehen? Dies hängt davon ab, was Sie erreichen möchten, indem Sie in jeder Zeile Haltepunkte setzen. Wenn Sie Ausdrücke auswerten möchten, können Sie dies tun, indem Sie meiner Logik folgen (Schritt für Schritt durch jede Zeile).

+0

Guter Punkt. Sie haben Recht, aber ich habe vergessen zu sagen, dass ich eine Binärdatei ausführe, die nicht mit dem Flag -g kompiliert wurde. Ich habe auch keinen Zugriff auf den Quellcode, daher kann ich nicht mit -g kompilieren. Leider lässt mich das nicht einen Schritt gehen. Frage wurde für Klarheit geklärt – smaccoun

Verwandte Themen