Wie man die relative Adresse, die von einem Feld in eine Struktur-dump. [C]
Arbeiten wir an einem C-Programm compiliert mit arm-eabi-gcc unter Linux.
Verwenden wir einen dump einer großen Struktur und wir haben Probleme bei der Festlegung, an welche Adresse sollten wir Lesen verschiedenen Bereichen unserer Struktur (50), (memory Alignment und padding sind nicht so vorhersehbar für mich).
Gibt es eine Möglichkeit um den Speicher zu bekommen der Abbildung der Struktur produziert werden von unseren compiler. Eine option in der gdb? Oder irgendein tool hilft uns finden Sie die Korrespondenz zwischen den Feldern und Adresse in der dump?
Ich bin wahrscheinlich etwas fehlt hier offensichtlich, aber wenn Sie eine variable (sagen wir mal
Ich bin nicht versuchen, um die Adresse von dem, was ich will, zu sichern. Ich habe bereits den dump und muss die relative Adresse aller Mitglieder.
x
) deklariert wie eine Struktur-Instanz (oder ein Zeiger auf die Struktur), dann sollten Sie in der Lage, nur geben Sie print x
(oder print *x
wenn ein Zeiger) in der gdb-dump alle Mitglieder.Ich bin nicht versuchen, um die Adresse von dem, was ich will, zu sichern. Ich habe bereits den dump und muss die relative Adresse aller Mitglieder.
InformationsquelleAutor Akhneyzar | 2012-03-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie es mit
gdb
. Als Beispiel verwende ich diese Quelle:Laden der Binärdatei in
gdb
:UPDATE:
Wenn Sie brauchen, um es für eine große Anzahl von Feldern, dann finden Sie es vielleicht praktisch, um den Gebrauch von GDB ' s neue python-Schnittstelle (Sie benötigen eine aktuelle version von GDB, es zu benutzen, ich bin mit 7.4). Ich habe offsets.py:
Dann können Sie hinzufügen, um Ihre .gdbinit:
Dann mit es in GDB, wie:
Dieses Skript macht ein paar vereinfachende Annahmen, wie die, die Sie nicht verwenden, bitfields, und es nicht tief in sich geschachtelte Strukturen, aber diese änderungen are3 ziemlich unkompliziert, wenn Sie Sie benötigen.
Ich machte eine vollständige version von diesem, vielen Dank für die inspiration. Clicky
Ihre
.gdbinit
sieht ganz komisch aus. Warum nichtsource /path/to/script/dir/offsets.py
Soweit ich weiß, die Quelle ist für die Ausführung von anderen gdb-Befehle. So, könnte man das snippet in eine andere Datei und der Quelle, aber ich glaube nicht, können Sie direkt den Quelltext der python-Skript.
Dies dokumentiert hier. Watch out Python-version (2/3) und stellen Sie sicher, dass Sie keinen gdb-minimal
InformationsquelleAutor FatalError
Können Sie tun es aus einem C-Programm unter Verwendung der standard -
offsetof()
makro, definiert instddef.h
. Aber ich bin nicht sicher, ob dies ist, was Sie wollen, da Sie möglicherweise nicht in der Lage, um es auszuführen (kompilieren Sie es auf dem host wird wahrscheinlich zurückkehren falsche offsets).Jedoch können Sie in der Lage sein, Sie zu beschäftigen einige hacks, um die Offsets von einer kompilierten binären, ohne Sie auszuführen. Vielleicht weisen Sie eine statische variable des offset-Wertes, und finden Sie einige Weg, um seinen Wert.
InformationsquelleAutor Ambroz Bizjak
Scheint mir, Sie könnte ein wenig code schreiben, wie dies für die erforderlichen Felder
zur Berechnung der offset in bytes in diesem kompilieren situation.
Diese sollte für jede Ausrichtung Fragen der compiler hat.
Dies gilt nicht kompilieren: pointer-Arithmetik nicht erlaubt, Sie zu subtrahieren Sie einen Zeiger S ein Zeiger auf X.
InformationsquelleAutor Elemental