que - ¿Cómo extrae la información de la variable local(dirección y tipo) de un programa Delphi o la información de depuración generada por el compilador?
declarar procedimientos delphi (1)
Mi meta es:
- Dado un subproceso suspendido en un programa de Windows de 32 o 64 bits compilado por Delphi, para recorrer la pila (factible)
- Dadas entradas de pila, para enumerar las variables locales en cada método y sus valores. Es decir, al menos, encuentre su dirección y tipo (entero32 / 64 / con signo / sin signo, cadena, flotante, registro, clase ...) cuya combinación se puede usar para encontrar su valor.
La primera está bien y es la segunda de la que trata esta pregunta. En un nivel alto, ¿cómo enumera las variables locales dada una entrada de pila en Delphi?
En un nivel bajo, esto es lo que he estado investigando:
RTTI: no enumera este tipo de información sobre los métodos. Esto no era algo que en realidad pensara que fuera una opción realista, pero de todos modos enumerar aquí.
Información de depuración: carga de la información de depuración producida para una compilación de depuración.
- Archivos de mapa: incluso un archivo de mapa detallado (¡un archivo de formato de texto! Abra uno y eche un vistazo) no contiene información de variables locales. Básicamente es una lista de direcciones y números de línea del archivo fuente. Ideal para la dirección de archivo y la correlación de línea, por ejemplo, los puntos azules en la canaleta; no es genial para obtener información más detallada
- Información de depuración remota (archivo RSM): no se conoce información sobre su contenido o formato.
- Archivos TD32 / TDS: mi línea actual de investigación. Contienen símbolos globales y locales entre mucha otra información.
Los problemas que encuentro aquí son:
- No hay documentación del formato de archivo TD32 (que puedo encontrar).
- La mayor parte de mi conocimiento de ellos proviene del código Jedi JCL que los usa (JclTD32.pas) y no estoy seguro de cómo usar ese código, o si las estructuras allí son lo suficientemente extensas como para mostrar variables locales. Estoy bastante seguro de que manejará símbolos globales, pero no estoy muy seguro acerca de lo local. Hay una gran variedad de constantes definidas y sin documentación para el formato, para leer lo que significan, me quedo adivinando. Sin embargo, esas constantes y sus nombres deben provenir de alguna parte.
- La fuente que puedo encontrar usando la información de TDS no carga ni maneja símbolos locales.
Si este es el enfoque correcto, entonces esta pregunta se convierte en ''¿Existe documentación para el formato de archivo TDS / TD32 y hay ejemplos de código que carguen variables locales?''
Una muestra de código no es esencial, pero podría ser muy útil, incluso si es muy mínima.
Compruebe si algún símbolo de depuración no estaba en binario. También es posible usar GDB (en Windows un puerto). Sería genial si encontraras un archivo .dbg o .dSYM. Contienen código fuente, por ejemplo.
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 no tiene ningún archivo de depuración, puede intentar obtener MinGW o Cygwin, y usar nm (1) ( página de manual ). Leerá nombres de símbolos de binarios. Pueden contener algunos tipos, como los de C ++:
int abc::def::Ghi::jkl(const std::string, int, const void*)
No olvides agregar la opción
--demangle
o obtendrás algo como:
__ZN11MRasterFont21getRasterForCharacterEh
en lugar de:
MRasterFont::getRasterForCharacter(unsigned char)