Ich führe ein grundlegendes C Programm mit gdb aus. Ich habe einen Breakpoint am Anfang von main()
. Nach dem Ausführen des Codes bricht gdb wie erwartet bei main () ab.
Wenn ich jetzt das Stapelzeigerregister (rsp) untersuche, sehe ich
Wenn ich dieselbe Information mit cat /proc/17232/stat | cut -d" " -f29/proc
(wo 17232 für diesen Prozess pid ist) abrufe, sehe ich:
Wie kommt es, dass wir einen anderen Wert des aktuellen Stapelzeigers von gdb sehen? Und warum zeigt gdb den Inhalt von rsp als NULL (0x00000000) an?
Danke.
Drucken Sie das rsp -Register (auf 64b-CPUs) von /proc
gibt tatsächlich einen anderen Wert als der von /proc
seit gdb muss zu Beginn des Programms eine Unterbrechung im Programm erzwingen die main -Funktion, um die Ausführung zu übernehmen, und ein minimaler Satz von Daten (Rücksprungadresse, einige Registersicherungen) wird auf dem Stapel gespeichert. gdb verwendet dann seinen eigenen Stack, um das Programm nicht zu überlaufen, und führt die erforderlichen Anpassungsoperationen durch, wenn Sie die Register anzeigen oder an den Stack-Daten arbeiten - und nicht die internen gdb Kochen. % Co_de% zeigt jedoch die echten Daten unverändert.
Der "echte" rsp von /proc
ist eigentlich etwas kleiner als der gdb , da der Stack auf x86-CPUs nach unten wächst.
Was den Wert null betrifft, ist dies während meiner Tests nicht geschehen
%Vor%Tags und Links c linux operating-system