Comment extrayez-vous les informations sur les variables locales (adresse et type) d’un programme Delphi ou les informations de débogage générées par le compilateur?

Mon but est:

  • Étant donné un thread suspendu dans un programme Windows 32 ou 64 bits compilé par Delphi, pour parcourir la stack (faisable)
  • Compte tenu des entrées de stack, énumérer les variables locales dans chaque méthode et leurs valeurs. C’est, à tout le moins, trouver leur adresse et leur type (integer32 / 64 / signed / unsigned, ssortingng, float, record, class …) dont la combinaison peut être utilisée pour trouver leur valeur.

Le premier est correct et c’est la seconde question de cette question. À un niveau élevé, comment énumérer les variables locales à partir d’une entrée de stack dans Delphi?


À un niveau bas, c’est 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 réellement être une option réaliste, mais listant ici de toute façon.

Informations de débogage: Chargement des informations de débogage produites pour une version de débogage.

  • Fichiers cartographiques: même un fichier de carte détaillé (un fichier au format texte! Ouvrez-en un et jetez un coup d’oeil) ne contient pas d’informations sur les variables locales. Il s’agit essentiellement d’une liste d’adresses et de numéros de ligne du 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 mondiaux et locaux parmi beaucoup d’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 proviennent du code Jedi JCL qui les utilise (JclTD32.pas) et je ne suis pas sûr de savoir comment utiliser ce code, ou si les structures sont suffisamment étendues pour afficher des vars locaux. Je suis quasiment certain que ça va gérer les symboles globaux, mais je suis très incertain à propos du local. Il y a une grande variété de constantes définies et sans documentation pour le format, pour lire ce qu’elles veulent dire, je suis laissé deviner. Cependant, ces constantes et leurs noms doivent provenir de quelque part.
  • Source que je peux trouver en utilisant TDS info ne charge pas ou ne gère pas les symboles locaux.

Si c’est la bonne approche, alors cette question devient «Existe-t-il de la documentation pour le format de fichier TDS / TD32 et existe-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 si c’est très minime.

    Vérifiez si des symboles de débogage n’étaient pas en binary. Il est également possible d’utiliser GDB (sur un port Windows). Ce serait bien si vous trouviez un fichier .dbg ou .dSYM. 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 ne disposez pas de fichiers de débogage, vous pouvez essayer d’obtenir MinGW ou Cygwin et utiliser nm (1) ( page de manuel ). Il lira les noms de symboles du binary. Ils peuvent contenir certains types, comme ceux de C ++:

     int abc::def::Ghi::jkl(const std::ssortingng, int, const void*) 

    N’oubliez pas d’append l’option --demangle alors ou vous obtiendrez quelque chose comme:

     __ZN11MRasterFont21getRasterForCharacterEh 

    au lieu de:

     MRasterFont::getRasterForCharacter(unsigned char)