Mon but est:
- Étant donné un thread suspendu dans un programme Windows 32 ou 64 bits compilé en Delphi, parcourir la pile (faisable)
- Compte tenu des entrées de pile, pour énumérer les variables locales dans chaque méthode et leurs valeurs. C'est-à-dire à tout le moins trouver leur adresse et leur type (entier32 / 64 / signé / non signé, chaîne, flottant, enregistrement, classe ...) dont la combinaison peut être utilisée pour trouver leur valeur.
Le premier est très bien et c'est le second sur lequel porte cette question. À un niveau élevé, comment énumérer les variables locales étant donné une entrée de pile dans Delphi?
À un niveau bas, voici ce que j'ai étudié:
RTTI: ne répertorie pas ce type d'informations sur les méthodes. Ce n'était pas quelque chose que je pensais vraiment être une option réaliste, mais je l'ai quand même répertorié ici.
Informations de débogage: chargement des informations de débogage produites pour une génération de débogage.
- Fichiers cartographiques: même un fichier cartographique détaillé (un fichier au format texte! Ouvrez-en un et jetez un œil) ne contient pas d'informations sur les variables locales. Il s'agit essentiellement d'une liste d'adresses et de numéros de ligne de fichier source. Idéal pour la corrélation d'adresse à fichier et de ligne, par exemple les points bleus dans la gouttière; pas génial pour des informations plus détaillées
- Informations de débogage à distance (fichier RSM) - aucune information connue sur son contenu ou son format.
- Fichiers TD32 / TDS: ma ligne de recherche actuelle. Ils contiennent des symboles globaux et locaux parmi de nombreuses autres informations.
Les problèmes que je rencontre ici sont:
- Il n'y a pas de documentation sur le format de fichier TD32 (que je peux trouver.)
- La plupart de mes connaissances à leur sujet proviennent du code Jedi JCL qui les utilise (JclTD32.pas) et je ne sais pas comment utiliser ce code, ni si les structures sont suffisamment étendues pour afficher les variables locales. Je suis à peu près certain qu'il gérera les symboles mondiaux, mais je suis très incertain à propos du local. Il existe une grande variété de constantes définies et sans documentation pour le format, pour lire ce qu'elles signifient, je me laisse deviner. Cependant, ces constantes et leurs noms doivent venir de quelque part.
- La source que je peux trouver à l'aide des informations TDS ne charge ni ne gère les symboles locaux.
Si c'est la bonne approche, alors cette question devient "Existe-t-il une documentation pour le format de fichier TDS / TD32, et y a-t-il des exemples de code qui chargent des variables locales?"
Un exemple de code n'est pas essentiel mais pourrait être très utile, même s'il est très minime.
Réponses:
Vérifiez si des symboles de débogage n'étaient pas en binaire. Il est également possible d'utiliser GDB (sur Windows un port de celui-ci). Ce serait formidable si vous trouviez un fichier .dbg ou .dSYM. Ils contiennent du code source, par exemple.
Si vous n'avez aucun fichier de débogage, vous pouvez essayer d'obtenir MinGW ou Cygwin et utiliser nm (1) ( page de manuel ). Il lira les noms de symboles à partir du binaire. Ils peuvent contenir certains types, comme ceux en C ++:
N'oubliez pas d'ajouter l'
--demangle
option alors ou vous obtiendrez quelque chose comme:au lieu de:
la source
strings
. Il extraira les chaînes de n'importe quel fichier binaire. Voir la page de manuel . Cela imprimera des chaînes qui peuvent mais ne doivent pas être utilesJetez un œil à http://download.xskernel.org/docs/file%20formats/omf/borland.txt Open Architecture Handbook. Il est ancien, mais vous trouverez peut-être des informations pertinentes sur le format de fichier.
la source