Mi meta es:
- Dado un hilo suspendido en un programa de Windows de 32 o 64 bits compilado con Delphi, para recorrer la pila (factible)
- Dadas las entradas de la pila, enumerar las variables locales en cada método y sus valores. Es decir, como mínimo, encuentre su dirección y tipo (integer32 / 64 /igned / unsigned, string, float, record, class ...) 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 se enumeran las variables locales dada una entrada de pila en Delphi?
En un nivel bajo, esto es lo que he estado investigando:
RTTI: no incluye este tipo de información sobre métodos. Esto no fue algo que en realidad alguna vez pensé que fuera una opción realista, pero enumerar aquí de todos modos.
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 en formato de texto! Abra uno y eche un vistazo) no contiene información de variable local. Básicamente es una lista de direcciones y números de línea de archivos de origen. Excelente para la correlación de dirección a archivo y línea, por ejemplo, los puntos azules en el canalón; 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 de investigación actual. 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 vars locales. Estoy bastante seguro de que manejará símbolos globales, pero no estoy muy seguro 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 cargan variables locales?'
Una muestra de código no es esencial, pero podría ser muy útil, incluso si es mínima.
Respuestas:
Compruebe si algún símbolo de depuración no estaba en binario. También es posible usar GDB (en Windows, un puerto del mismo). Sería genial si encontrara un archivo .dbg o .dSYM. Contienen código fuente, por ejemplo.
Si no tiene ningún archivo de depuración, puede intentar obtener MinGW o Cygwin y usar nm (1) ( página de manual ). Leerá los nombres de los símbolos del binario. Pueden contener algunos tipos, como los de C ++:
No olvide agregar la
--demangle
opción entonces o obtendrá algo como:en vez de:
fuente
strings
. Extraerá cadenas de cualquier archivo binario. Consulte la página de manual . Esto imprimirá cadenas que pueden, pero no tienen que ser útilesEche un vistazo al http://download.xskernel.org/docs/file%20formats/omf/borland.txt Open Architecture Handbook. Es antiguo, pero tal vez encuentre información relevante sobre el formato de archivo.
fuente