2015-03-10 7 views
6

Ich habe einen Arbeitsspeicher eines Prozesses, der abgestürzt ist (schwer zu reproduzieren).Untersuchen von lokalen Variablen zurückgegebene Funktion

Ich habe herausgefunden, dass etwas schief geht in einer Funktion, die gerade zurückgegeben hat (es gab einen Nullzeiger anstelle eines Nicht-Nullzeigers zurück).

Es wäre eine große Hilfe für mich, den Inhalt der Stapelvariablen in dieser Funktion zu kennen. Ich denke, auf den meisten Architekturen bedeutet das Zurückkehren von einer Funktion nur das Ändern des Stapelzeigers. Mit anderen Worten, diese Werte sind immer noch da (unter dem Stapelzeiger, wenn wir x86 als Beispiel nehmen).

Kann mir jemand bestätigen, dass meine Argumentation korrekt ist und vielleicht ein Beispiel geben, wie funktioniert das mit gdb?

Stimmt meine Argumentation auch für MIPS?

+1

In GBD versuchen 'Hilfe x'. – alk

Antwort

4

Lokale Variablen wurden möglicherweise auf dem Stack gespeichert, aber nicht unbedingt. Wenn es nur eine kleine Anzahl von Variablen gibt, die in Register passen und der Code optimiert ist, wurden lokale Variablen niemals auf dem Stapel gespeichert. Abhängig von der verwendeten Aufrufkonvention können die endgültigen Werte lokaler Variablen in Registern noch bestehen bleiben.

Zerlegen Sie die fragliche Funktion (Sie können hierzu objdump -dS verwenden, so dass Sie die Quelle leicht korrelieren können). Sehen Sie, wie auf lokale Variablen zugegriffen wurde. Wurden sie im Speicher oder in Registern gespeichert? Wurden die Register bereits auf ihren für den Aufrufer relevanten Wert zurückgesetzt?

Wenn der ursprüngliche Registerwert nicht wiederhergestellt wurde, können Sie nur das Register überprüfen, das zum Speichern des lokalen Registers verwendet wurde. Wenn es bereits restauriert wurde, ist es wahrscheinlich verloren.

Wenn lokale Werte im Stack gespeichert wurden, sollte der Funktionsprolog (erste Anweisungen) Ihnen sagen, wie Stack- und Frame-Pointer manipuliert wurden. Unter Berücksichtigung dieses Anrufs, der auch im Stapel gespeichert wurde (PC gespeichert), können Sie den Wert des in dieser Funktion verwendeten Stapel-/Rahmenzeigers berechnen. Verwenden Sie dann x, um Speicherorte zu untersuchen.

Je nach aufgerufener Funktion könnten Sie auch die Argumente überprüfen (wenn sie aufgerufen werden) und den Wert der lokalen Variablen neu berechnen.

0

können Sie lokale Variable sehen, die mit nicht optimiert werden muss:

info locals 

Es ist nicht in einer Funktion arbeiten kann, die bereits zurückkehren, though. Wenn Sie das Programm erneut ausführen können, versuchen Sie, einen Haltepunkt kurz vor der Funktion zurückzugeben.

Andernfalls können Sie den Stapel mit x/x und info register manuell untersuchen, um die Stapelzeigeradresse zu kennen.

Sie können den Stapel dann mit up und down durchsuchen.

+0

Wenn die Funktion bereits beendet wurde, sind die Locals nicht mehr auf dem Stack. – urzeit

+0

Oh, es ist zurückgekehrt. Habe das nicht bemerkt. – blue112