Mein Ziel ist:
- Angesichts eines angehaltenen Threads in einem von Delphi kompilierten 32- oder 64-Bit-Windows-Programm, um den Stapel zu durchlaufen (machbar)
- Gegebene Stapeleinträge, um die lokalen Variablen in jeder Methode und ihre Werte aufzulisten. Das heißt, zumindest finden Sie ihre Adresse und ihren Typ (Ganzzahl 32/64 / signiert / vorzeichenlos, Zeichenfolge, Float, Datensatz, Klasse ...), deren Kombination verwendet werden kann, um ihren Wert zu ermitteln.
Das erste ist in Ordnung und es ist das zweite, um das es bei dieser Frage geht. Wie werden auf hoher Ebene lokale Variablen bei einem Stapeleintrag in Delphi aufgelistet?
Auf niedrigem Niveau habe ich Folgendes untersucht:
RTTI: Listet diese Art von Informationen zu Methoden nicht auf. Dies war nicht etwas, was ich jemals für eine realistische Option gehalten hätte, aber hier trotzdem aufzulisten.
Debug-Informationen: Laden der für einen Debug-Build erstellten Debug-Informationen .
- Kartendateien: Selbst eine detaillierte Kartendatei (eine Datei im Textformat! Öffnen Sie eine und schauen Sie sie sich an) enthält keine lokalen Variableninformationen. Es ist im Grunde eine Liste von Adressen und Zeilennummern der Quelldatei. Hervorragend geeignet für die Korrelation von Adresse zu Datei und Zeile, z. B. die blauen Punkte in der Rinne. Nicht gut für detailliertere Informationen
- Remote-Debugging-Informationen (RSM-Datei) - Keine bekannten Informationen zu Inhalt oder Format.
- TD32 / TDS-Dateien: meine aktuelle Forschungsrichtung. Sie enthalten neben vielen anderen Informationen globale und lokale Symbole.
Die Probleme, auf die ich hier stoße, sind:
- Es gibt keine Dokumentation des TD32-Dateiformats (die ich finden kann.)
- Der größte Teil meines Wissens über sie stammt aus dem Jedi-JCL-Code, der sie verwendet (JclTD32.pas), und ich bin mir nicht sicher, wie ich diesen Code verwenden soll oder ob die Strukturen dort umfangreich genug sind, um lokale Variablen anzuzeigen. Ich bin mir ziemlich sicher, dass es mit globalen Symbolen umgehen wird, aber ich bin mir über lokale sehr unsicher. Es gibt eine Vielzahl von Konstanten definiert und ohne Dokumentation für das Format. Um zu lesen, was sie bedeuten, muss ich raten. Diese Konstanten und ihre Namen müssen jedoch von irgendwoher kommen.
- Quelle, die ich mithilfe von TDS-Informationen finden kann, lädt oder verarbeitet keine lokalen Symbole.
Wenn dies der richtige Ansatz ist, lautet diese Frage: "Gibt es eine Dokumentation für das TDS / TD32-Dateiformat und gibt es Codebeispiele, die lokale Variablen laden?"
Ein Codebeispiel ist nicht unbedingt erforderlich, kann aber sehr nützlich sein, auch wenn es sehr minimal ist.
Antworten:
Überprüfen Sie, ob Debugging-Symbole nicht binär waren. Möglich ist auch die Verwendung von GDB (unter Windows ein Port davon). Es wäre großartig, wenn Sie eine .dbg- oder .dSYM-Datei finden würden. Sie enthalten Quellcode, z.
Wenn Sie keine Debugging-Dateien haben, können Sie versuchen, MinGW oder Cygwin abzurufen und nm (1) ( Manpage ) zu verwenden. Es werden Symbolnamen aus der Binärdatei gelesen. Sie können einige Typen enthalten, wie z. B. C ++:
Vergessen Sie dann nicht, die
--demangle
Option hinzuzufügen, sonst erhalten Sie Folgendes:anstatt:
quelle
strings
. Es werden Zeichenfolgen aus jeder Binärdatei extrahiert. Siehe Manpage . Dies wird Zeichenfolgen drucken, die möglicherweise hilfreich sein müssen, aber nicht müssenSchauen Sie sich das http://download.xskernel.org/docs/file%20formats/omf/borland.txt Open Architecture Handbook an. Es ist alt, aber vielleicht finden Sie einige relevante Informationen über das Dateiformat.
quelle