strace
pode apenas strace
arquivos executáveis.
funk_a
é uma função, uma construção de programação do shell, não algo que você possa executar.
A única coisa que strace
poderia usar seria um novo shell que avalia o corpo dessa função como:
strace -o trace_output.txt -Ttt bash -c "$(typeset -f funk_a); funk_a"
(eu removi -c
porque não faz sentido com -Ttt
).
Mas você verá todo o sistema chamado feito por bash
para carregar e inicializar (e depois de limpar e sair), além da chamada de sistema write
feita por essa função funk_a
.
Ou você poderia dizer a strace
para rastrear o pid do shell enquanto avalia a função funk_a
:
strace -o trace_output.txt -Ttt -p "$$" &
funk_a
kill "$!"
Embora, no momento em que strace
se anexa ao PID do shell, o shell poderia ter terminado de interpretar a função. Você poderia tentar alguma sincronização como
strace -o trace_output.txt -Ttt -p "$$" &
tail -F trace_output.txt | read # wait for some output in trace_output.txt
funk_a
kill "$!"
Mas, mesmo assim, dependendo do momento, trace_output.txt
incluiria algumas das chamadas de sistema usadas interpretar tail|read
ou kill
poderia matar strace
antes de ter tido tempo de gravar o rastreio para o echo
comando para o arquivo de saída.
Uma abordagem melhor poderia ser envolver a chamada para funk_a
entre duas chamadas de sistema reconhecíveis, como
strace -fo >(sed -n '1,\|open("///dev/null|d
\|open("/dev///null|q;p' > trace_output.txt
) -Ttt -p "$$" &
sleep 1 # give enough time for strace to start
exec 3< ///dev/null # start signal
funk_a
exec 3< /dev///null # end signal