wie GDB weiß, dass es am angegebenen Haltepunkt brechen muss?

8

Eine grundlegende Frage & amp; Ich bin sehr neu in C / C ++ und GDB.

Wir verwenden GDB, um einen Prozess zu debuggen. Wir verbinden GDB mit einem Prozess und geben dann filename.c zusammen mit der Zeilennummer an, um den Breakpoint zu setzen.

Meine Frage ist: "Wie würde GDB oder OS ODER möglicherweise irgendetwas anderes wissen, dass es an der angegebenen Leitungsnummer (in filename.c) brechen muss, nachdem wir GDB mit laufendem Prozess verbunden haben?"

Was kommt ins Bild, dass zum Beispiel der aktuelle Prozess im Debug-Modus ausgeführt wird und ein Breakpoint angewendet wird und die Prozessausführung an diesem Punkt unterbrochen werden muss (warten auf Benutzereingaben)?

    
Gana 07.06.2013, 15:03
quelle

4 Antworten

6

Ich kann die neueste Version von gdb nicht kommentieren - aber viele Debugger vertauschen tatsächlich die Assembly-Anweisung am gewünschten Haltepunkt (im Speicher) mit einer Interrupt-Anweisung. Dies "wacht" den Debugger auf, der an dieser Stelle die Kontrolle übernimmt.

Mit einem ersetzten Interrupt-Befehl kann die CPU Ihr Programm mit voller Geschwindigkeit ausführen und am gewünschten Ort "hochfahren".

Moderne Prozessoren sind jedoch sehr komplex und haben wahrscheinlich weit bessere Debugging-Funktionen.

    
PP. 07.06.2013, 15:19
quelle
9

Genauso, wenn Ihr Programm an einem bestimmten Punkt stoppt oder abstürzt, kann der Debugger Ihnen sagen, wo im Programm dieser Punkt ist.

Damit beide funktionieren, muss das Programmbinär zusätzliche Debuginformationen enthalten, die Adressen im Programmabbild mit Speicherorten im Quellcode (Quelldatei und Zeilennummer) verknüpfen.

Um einen Haltepunkt in einer bestimmten Zeile hinzuzufügen, findet der Debugger die Programmadresse, die dieser Zeile am nächsten ist, modifiziert die Kopie der ausführbaren Datei im Speicher, um an dieser Stelle einen speziellen "break" -Befehl einzufügen, der die Ausführung des Programms unterbricht , "verfolgt" die Ausführung des Programms und wartet darauf, dass es den Haltepunkt erreicht und stoppt.

Weitere Einzelheiten finden Sie in Ссылка und Ссылка

    
Jonathan Wakely 07.06.2013 15:15
quelle
1

GDB ist sich Ihres Codes bewusst: Er weiß alles darüber. Wenn Sie einen Haltepunkt auf einer Linie setzen, erhält GDB die äquivalente Maschinenbefehlsadresse: Ihr gesamter Code (als Maschinenanweisungen) wird in den Speicher geladen, so dass die Anweisungen Ihres Codes eine Adresse haben.

Nun kennt GDB die Adresse der Anweisung, die Sie brechen wollen. Wenn Sie Ihr Programm ausführen, verwendet GDB ptrace, wodurch GDB jeden Befehl vor der Ausführung sehen kann. Dann muss GDB nur schauen, ob die aktuelle Anweisung (die ausgeführt wird) dieselbe ist wie Ihre Anweisung (die Sie brechen wollen).

    
nouney 07.06.2013 15:17
quelle
-2

Wenn Sie die Option -g in gcc / g ++ verwendet haben, werden die Zeilennummern jeder Quelldatei an die Anweisungen in den resultierenden Objektdateien angehängt.

    
user66296 07.06.2013 15:08
quelle

Tags und Links