Il mio obiettivo è:
- Dato un thread sospeso in un programma Windows a 32 o 64 bit compilato da Delphi, per camminare sullo stack (fattibile)
- Date le voci dello stack, per enumerare le variabili locali in ciascun metodo e i loro valori. Cioè, come minimo, trova il loro indirizzo e tipo (integer32 / 64 / signed / unsigned, string, float, record, class ...) la cui combinazione può essere usata per trovare il loro valore.
Il primo va bene ed è il secondo di cui tratta questa domanda. Ad alto livello, come enumerare le variabili locali data una voce dello stack in Delphi?
A un livello basso, questo è ciò su cui sto indagando:
RTTI: non elenca questo tipo di informazioni sui metodi. Questo non era qualcosa che in realtà ho mai pensato fosse un'opzione realistica, ma elencare qui comunque.
Informazioni di debug: caricamento delle informazioni di debug prodotte per una build di debug.
- File mappa: anche un file mappa dettagliato (un file in formato testo! Aprine uno e guarda) non contiene informazioni sulle variabili locali. È fondamentalmente un elenco di indirizzi e numeri di riga del file di origine. Ottimo per la correlazione tra indirizzo e file e linea, ad esempio i punti blu nella grondaia; non eccezionale per informazioni più dettagliate
- Informazioni di debug remoto (file RSM): nessuna informazione nota sul suo contenuto o formato.
- File TD32 / TDS: la mia attuale linea di ricerca. Contengono simboli globali e locali tra molte altre informazioni.
I problemi che sto riscontrando qui sono:
- Non c'è documentazione del formato di file TD32 (che posso trovare).
- La maggior parte della mia conoscenza su di loro deriva dal codice Jedi JCL che li utilizza (JclTD32.pas) e non sono sicuro di come utilizzare quel codice o se le strutture sono abbastanza ampie da mostrare le variabili locali. Sono abbastanza certo che gestirà simboli globali, ma sono molto incerto sul locale. Ci sono un'ampia varietà di costanti definite e senza documentazione per il formato, per leggere cosa significano, non mi resta che indovinare. Tuttavia, quelle costanti e i loro nomi devono provenire da qualche parte.
- La fonte che riesco a trovare utilizzando le informazioni TDS non carica o gestisce i simboli locali.
Se questo è l'approccio giusto, la domanda diventa "Esiste documentazione per il formato di file TDS / TD32 e ci sono esempi di codice che caricano variabili locali?"
Un esempio di codice non è essenziale ma potrebbe essere molto utile, anche se è molto minimo.