Como sei qual arquivo um programa está tentando acessar?

6

Eu tenho um programa que estou tentando executar, no entanto, quando eu o executo; apenas reclama que não consegue encontrar um arquivo em particular.

No entanto, não tenho ideia de em qual pasta ele está tentando encontrar esse arquivo específico. Eu tenho uma cópia do arquivo necessário, só preciso saber qual pasta copiar também.

Existe alguma maneira de mostrar em tempo real quais arquivos estão sendo acessados ou quais arquivos estão tentando e não sendo acessados?

Estou usando o sistema de arquivos Ext4, se isso ajudar.

Obrigado

    
por user9069 23.09.2012 / 04:30

2 respostas

11

(Eu postei minha resposta pela primeira vez neste pergunta askubuntu , mas removeu de lá e postou aqui, como é mais relevante.)

Existem várias maneiras de investigar quais processos de arquivos e bibliotecas foram abertos; As principais ferramentas são lsof , strace e ltrace . Às vezes, é necessário executá-los com sudo , para que o programa tenha acesso a tudo o que precisa para obter um instantâneo preciso do que um programa está chamando.

1) Com lsof você precisa encontrar o id do processo que deseja consultar, por exemplo, use:

lsof -c firefox

, que listará todos os arquivos firefox abertos e todas as suas chamadas para as bibliotecas compartilhadas do sistema. (O Firefox atualmente tem um pid de 3310 no meu sistema, então você também pode usar lsof -p 3310 , mas você teria que procurar o ID do processo primeiro com ps aux | grep [f]irefox  ). Mais informações sobre lsof estão detalhadas neste artigo da IBM útil.

2) ltrace e strace têm funções e opções muito semelhantes e são muito úteis para descobrir informações detalhadas sobre quais chamadas um processo está realizando. A principal diferença é que ltrace geralmente rastreia apenas library chamadas (embora possa rastrear chamadas do sistema com a opção -S ), enquanto strace rastreia as chamadas library e outras system . Mais informações sobre processos de rastreamento estão disponíveis em artigo da IBM . Lsof é provavelmente mais útil se você quiser examinar um processo já em execução, mas strace também pode fazer isso e monitorar as chamadas em tempo real quando receber um pid de processo (o sudo é sempre usado quando se anexa a um processo) :

sudo strace -p 3310

mas é muito mais útil iniciar o programa com strace e ver o que foi chamado, como no exemplo a seguir:

strace -f -e trace=open /usr/bin/firefox

Você pode executar apenas strace com o processo de destino e sem opções, mas as opções aqui significam que processos filho são rastreados ( -f ) e que todas as chamadas de sistema abertas são rastreadas ( -e trace=open ) Se você quiser salvar a saída no arquivo, você pode especificar -o ~/firefox.trace antes de especificar /usr/bin/firefox .

Se você quiser uma lista resumida de chamadas da biblioteca, por exemplo, você pode usar

ltrace -c /usr/bin/leafpad

e depois sair do programa e a lista será produzida. Omita a opção -c para visualizar as chamadas em tempo real.

Os resultados de strace e ltrace podem não ser muito úteis para você, pois são difíceis de decifrar a menos que você saiba o que está procurando, mas lsof deve fornecer algumas informações úteis básicas.

    
por user76204 25.09.2012 / 01:27
3

A maneira mais fácil de fazer isso parece ser executar o programa através de strace e observar as chamadas stat64 () (que recebem informações sobre o arquivo) ou open () que abrem arquivos.

Então você faz:

strace -e stat64 -e open [program name]

E na saída resultante, procure:

(Nenhum arquivo ou diretório)

O caminho que ele estava tentando abrir deve estar à esquerda desse erro.

    
por user9069 23.09.2012 / 23:31

Tags