como "rastrear" um programa como o shell?

1

Eu entendo que dash é um shell "model" - ele foi escrito recentemente e bem e implementa apenas o que é requerido do shell POSIX. Eu olhei para o código-fonte do traço para entender como o "rastreamento" de um programa como o shell é feito.

"Rastreio" do traço é realizado compilando-o com DEBUG definido e invocando com -o debug . Quando você faz isso, um arquivo trace é aberto com fopen para o qual as informações são descartadas sobre o que o dash está fazendo quando é executado.

Exceto que todo o mecanismo, parece-me, não funciona, mesmo neste shell "perfeitamente escrito". Se eu tenho isso em um script de shell:

exec 3>&1

imediatamente todas as informações depois disso, provavelmente não serão mais enviadas para o arquivo trace , mas acabarão com stdout . Isso porque fopen chama open e provavelmente retorna o descritor de arquivo 3.

Este não é um exemplo inventado. Existem scripts comuns usados no mundo real que possuem linhas como

exec number >&1

(Eu vi isso em dois scripts autotools configure : para o software IP Infusion e Kerberos).

Então, como um shell pode ser depurado / rastreado, quando é necessário executar scripts como esses?

(Eu não estou procurando ferramentas fora do shell - eu quero saber qual é a maneira correta de rastrear, dentro de um programa como o shell. Ou não é possível em geral?)

    
por user322908 10.01.2016 / 22:46

1 resposta

1

Você pode usar um soquete ( syslogd faz isso, por exemplo). Mas então, como você se protegeria contra comandos como

LD_PRELOAD=my_bogus_socket_funcs.so somecommand

Ou você pode usar dup2 para alterar o descritor de arquivo para um valor mais alto número. Mas isso não é garantia, talvez apenas proteção contra erros de script (como usar 3 em vez de 2 em redirecionamentos).

Se o script quiser alterar o comportamento de rastreamento propositalmente, acredito que não há muito que um shell possa (ou deveria) fazer.

    
por 11.01.2016 / 00:11