Comment extraire des informations variables locales (adresse et type) d'un programme Delphi ou des informations de débogage générées par le compilateur?
mon but est:
- donné un thread suspendu dans un programme Windows 32 ou 64 bits compilé par Delphi, pour parcourir la pile (faisable)
- donné 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 (entier 32/64/signed/unsigned, chaîne, flottant, record, class...) dont la combinaison peut être utilisée pour trouver leur valeur.
la première est bonne et c'est la seconde que cette question concerne. À un niveau élevé, comment énumérer les variables locales à partir d'une entrée de pile dans Delphi?
À un bas niveau, c'est ce que j'ai étudié:
RTTI: ne donne pas ce genre d'information sur les méthodes. Ce n'était pas quelque chose que je n'ai jamais pensé être une option réaliste, mais liste ici de toute façon.
informations de débogage: chargement des informations de débogage produites pour une construction de débogage.
- Carte fichiers: même une carte détaillée de fichier (un texte-format de fichier! Ouvrez l'un et un coup d'oeil) ne contiennent pas de variable locale info. C'est essentiellement une liste d'adresses et de numéros de ligne de fichier source. Grand pour l'adresse de fichier et la corrélation de ligne, par exemple les points bleus dans le caniveau; pas grand pour des informations plus détaillées
- à Distance des informations de débogage (RSM fichier) - aucune information connue sur son contenu ou format.
- fichiers TD32/TDS: mon domaine de recherche actuel. Ils contiennent des symboles globaux et locaux parmi beaucoup d'autres informations.
les problèmes que je rencontre ici sont:
- il n'y a pas de documentation du format de fichier TD32 (que je peux trouver.)
- la plupart de mes connaissances d'eux viennent du code Jedi JCL qui les utilise (JclTD32.pas) et je ne sais pas comment utiliser ce code, ou si les structures y sont assez étendues pour montrer les vars locaux. Je suis sûr qu'il traitera des symboles mondiaux, mais je ne suis pas sûr du local. Il y a une grande variété de constantes définies et sans documentation pour le format, pour lire ce qu'elles signifient, je suis laissé deviner. Cependant, ces constantes et leurs noms doivent venir de quelque part.
- Source que je peux trouver de l'aide TDS info ne se charge pas ou la poignée locale symboles.
si c'est la bonne approche, alors cette question devient " y a-t-il de la documentation pour le format de fichier TDS/TD32, et y a-t-il des échantillons de code qui chargent des variables locales?
un échantillon de code n'est pas essentiel mais pourrait être très utile, même s'il est très minime.
1 réponses
vérifiez si les symboles de débogage n'étaient pas en binaire. Aussi possible est d'utiliser GDB (sur Windows un port de il.) Ce serait bien si vous en trouviez un .dbg ou .dSYM fichier. Ils contiennent du code source, par exemple:
gdb> list foo
56 void foo()
57 {
58 bar();
59 sighandler_t fnc = signal(SIGHUP, SIG_IGN);
60 raise(SIGHUP);
61 signal(SIGHUP, fnc);
62 baz(fnc);
63 }
Si vous n'avez pas de fichiers de débogage, vous pouvez essayer d'obtenir MinGW ou Cygwin, et d'utilisation nm(1) ( l'homme page ). Il lira les noms de symboles du binaire. Ils peuvent contenir certains types, comme ceux C++:
int abc::def::Ghi::jkl(const std::string, int, const void*)
N'oubliez pas d'ajouter l'option --demangle
ou vous obtiendrez quelque chose comme:
__ZN11MRasterFont21getRasterForCharacterEh
au lieu de:
MRasterFont::getRasterForCharacter(unsigned char)