Minha meta é:
- Dado um thread suspenso em um programa Windows de 32 ou 64 bits compilado em Delphi, para andar na pilha (factível)
- Entradas de pilha dadas, para enumerar as variáveis locais em cada método e seus valores. Ou seja, no mínimo, encontre seu endereço e tipo (inteiro32 / 64 / assinado / não assinado, string, float, registro, classe ...) cuja combinação pode ser usada para encontrar seu valor.
A primeira está bem e é a segunda que trata esta questão. Em um nível superior, como você enumera as variáveis locais dadas uma entrada de pilha no Delphi?
Em um nível baixo, é isso que venho investigando:
RTTI: não lista este tipo de informação sobre métodos. Isso não foi algo que eu realmente pensei ser uma opção realista, mas listar aqui de qualquer maneira.
Informações de depuração: Carregar as informações de depuração produzidas para uma compilação de depuração.
- Arquivos de mapa: mesmo um arquivo de mapa detalhado (um arquivo em formato de texto! Abra um e dê uma olhada) não contém informações de variáveis locais. É basicamente uma lista de endereços e números de linha do arquivo de origem. Ótimo para endereço para arquivo e correlação de linha, por exemplo, os pontos azuis na sarjeta; não é bom para informações mais detalhadas
- Informações de depuração remota (arquivo RSM) - nenhuma informação conhecida sobre seu conteúdo ou formato.
- Arquivos TD32 / TDS: minha linha de pesquisa atual. Eles contêm símbolos globais e locais, entre muitas outras informações.
Os problemas que estou encontrando aqui são:
- Não há documentação do formato de arquivo TD32 (que posso encontrar).
- A maior parte do meu conhecimento deles vem do código Jedi JCL que os usa (JclTD32.pas) e não tenho certeza de como usar esse código, ou se as estruturas lá são extensas o suficiente para mostrar vars locais. Tenho certeza de que vai lidar com símbolos globais, mas estou muito incerto sobre o local. Há uma grande variedade de constantes definidas e sem documentação para o formato, para ler o que significam, fico adivinhando. No entanto, essas constantes e seus nomes devem vir de algum lugar.
- A fonte que posso encontrar usando as informações de TDS não carrega nem manipula símbolos locais.
Se esta for a abordagem correta, a pergunta se tornará 'Há documentação para o formato de arquivo TDS / TD32 e há algum exemplo de código que carregue variáveis locais?'
Um exemplo de código não é essencial, mas pode ser muito útil, mesmo que seja mínimo.
Respostas:
Verifique se algum símbolo de depuração não estava em binário. Também é possível usar GDB (no Windows, uma porta dele). Seria ótimo se você encontrasse um arquivo .dbg ou .dSYM. Eles contêm código-fonte, por exemplo.
Se você não tiver nenhum arquivo de depuração, pode tentar obter o MinGW ou o Cygwin e usar nm (1) ( página do manual ). Ele lerá os nomes dos símbolos do binário. Eles podem conter alguns tipos, como os de C ++:
Não se esqueça de adicionar a
--demangle
opção então ou você obterá algo como:ao invés de:
fonte
strings
. Ele irá extrair strings de qualquer arquivo binário. Veja a página do manual . Isso imprimirá strings que podem, mas não precisam ser úteisDê uma olhada no http://download.xskernel.org/docs/file%20formats/omf/borland.txt Manual de Arquitetura Aberta. É antigo, mas talvez você encontre alguma informação relevante sobre o formato do arquivo.
fonte