Usando o ‘strace’

strace_output

O strace é uma ferramenta que basicamente  rastreia a execução de um determinado programa (ou processo), interceptando e registrando as chamadas que ele faz às funções do sistema e sua respectiva sinalização de retorno. É uma ferramenta muito útil para desenvolvedores como, também, para atividades de suporte.

Após aquela primeira dica eu até planejara acrescentar algumas outras mas acabei sendo atropelado por certas urgências, daí a pausa. Mas agora consegui um tempo para produzir esta “segunda dica”… 🙂

“Criando” um problema

Pois bem, um exemplo “prático”! Resolvi jogar a versão homebrew do jogo Bruce Lee para o Master System, daí é instalar o MESS, baixar o arquivo e:

$ mess sms -cart BruceLee-SMS-1.00.sms 
mpr-12808.ic2 NOT FOUND (tried in sms sms)
FATALERROR: Required files are missing, the system cannot be run.

Claro, está faltando a ROM do console , então você vai baixá-la (você sabe onde), colocá-la no mesmo diretório onde está o arquivo do jogo e tentar novamente:

$ ls
BruceLee-SMS-1.00.sms  mpr-12808.ic2
$ mess sms -cart BruceLee-SMS-1.00.sms 
mpr-12808.ic2 NOT FOUND (tried in sms sms)
FATALERROR: Required files are missing, the system cannot be run.

Opa, não era bem isso. Claro que basta ler a documentação e descobrir o local correto onde colocar o tal arquivo mas e se não houvesse documentação, acesso ao código fonte ou qualquer outra coisa que possa ajudar? Tudo o que você tem é um binário.

Achando a “solução”

Onde será que a ROM precisa ficar? É aí que o registro de chamadas do strace ajuda a identificar pois operações de arquivos feitas a partir de chamadas ao core do sistema operacional, ou seja, ele pedirá para alguém abrir um arquivo e obviamente informando o caminho completo de onde este deve estar.

Como a saída é extensa vou filtrar apenas o que interessa — as partes onde o programa procurará pelo arquivo “mpr-12808.ic2”:

$ strace mess sms -cart BruceLee-SMS-1.00.sms 2>&1 | grep "mpr-12808"
open("/home/giovanni/mess/roms/sms/mpr-12808.ic2", O_RDONLY) = -
1 ENOENT (No such file or directory)
open("/usr/local/share/games/mess/roms/sms/mpr-12808.ic2", O_RDO
NLY) = -1 ENOENT (No such file or directory)
open("/usr/share/games/mess/roms/sms/mpr-12808.ic2", O_RDONLY) =
 -1 ENOENT (No such file or directory)
open("/home/giovanni/mess/roms/sms/mpr-12808.ic2", O_RDONLY) = -
1 ENOENT (No such file or directory)
open("/usr/local/share/games/mess/roms/sms/mpr-12808.ic2", O_RDO
NLY) = -1 ENOENT (No such file or directory)
open("/usr/share/games/mess/roms/sms/mpr-12808.ic2", O_RDONLY) =
 -1 ENOENT (No such file or directory)
write(2, "mpr-12808.ic2 NOT FOUND (tried i"..., 43mpr-12808.ic2 
NOT FOUND (tried in sms sms)

E aí está, ele começou procurando em “~/mess/roms/sms” e em outros cinco lugares em em todos recebeu a informação de que o arquivo não estava lá. E a última ocorrência é justamente a mensagem de erro informando fato.

Então agora ficou fácil, basta criar a estrutura em ${HOME} e mover o arquivo para lá:

$ mkdir -p ~/mess/roms/sms
$ mv mpr-12808.ic2 ~/mess/roms/sms/
$ mess sms -cart BruceLee-SMS-1.00.sms

E agora que o arquivo é perfeitamente encontrado, hora da jogatina:

strace_MESS_SMS_Bruce_Lee

Aliás a conversão ficou muito boa, conheço este jogo há anos, sei que tem versões para diversas plataformas mas esta foi justamente a primeira que me fez ter interesse em jogá-lo.

Fechando

Tirando rodar emuladores, há alguma aplicação no mundo real? Sim, há alguns anos usei a mesma abordagem para descobrir que uma versão específica da JVM da  Sun Oracle não conseguia encontrar determinadas bibliotecas do sistema, apesar de tudo perfeita e corretamente configurado “como na versão anterior”. Infelizmente não tenho mais todos os componentes do problema de verdade e assim precisei simular algo equivalente com uma pequena ajudinha do MESS.

Anúncios

Um comentário sobre “Usando o ‘strace’

  1. Pingback: Usando o strace para rastrear chamadas feitas por programas e processos - Peguei do

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s