Saída do strace para outra janela

2

Digamos que eu queira descobrir como erguer funciona por strace .

É possível redirecionar a saída de strace para outra janela?

Para que eu possa ter duas janelas, uma para alavancar onde estou fazendo toda a interação e outra janela de saída de strace .

    
por megas 17.09.2016 / 13:19

2 respostas

3

Você pode usar strace -p em uma janela para rastrear um comando em execução em outra janela. A opção -p aceita um ou mais ids de processo, portanto você pode, por exemplo, tentar

strace -p "$(pidof pry)"

se você tiver pelo menos um processo que pidof reconheça como pry . Pode ser necessário experimentar com pidof (se eu quiser usar um comando pudb3 , preciso usar python3 em vez de pudb3 ) e usar pidof pode não ser a melhor abordagem se houver ambigüidade associada a ele (você pode ter vários comandos que correspondem, mas deseja apenas strace um deles). Pode ser mais fácil encontrar o processo certo com ps e fornecer a opção diretamente.

Essa abordagem provavelmente não funcionará bem com um processo de curta duração ou em uma situação em que é importante ver a saída no início da vida do processo, mas para um aplicativo interativo cujo tempo de inicialização não seja especialmente interessante, pode ser viável.

Uma diferença em usar strace -p em oposição a strace sem -p é como as interrupções são tratadas. Um processo lançado por strace terá interrupções como Ctrl-C passado para ele (e relatado por strace ), mas Ctrl-C em strace -p desanexá-lo e permitir que o processo continue sem rastrear (e Ctrl-C ainda funciona no aplicativo, se estiver em uma janela separada).

    
por 17.09.2016 / 16:11
2

E o método wrapper para processos de curta duração ou em que é importante ver a saída desde o início da vida útil do processo:

#!/bin/sh

# the pid could be sent to a file or named pipe the-thing-that-does-
# strace could be watching, though in most cases a human could copy it
echo "PID to strace is $$"

trap : USR2

# block while human copies pid over to strace (or some program acts on
# the above pid being written in that other terminal). Busy loop or
# something instead if this program must not consume input ('sleep'
# complicates the signal handling)
read blocking

# then when strace is up, send this process a USR2 signal. this will
# mean there will be some strace of this script in addition to the
# target, hence the kinda sorta caveat.
exec echo /the/program/of/interest

Ou, em vez disso, simplesmente execute sysdig nessa outra janela do terminal, pois sysdig pode espionar diretamente um programa pelo nome:

sysdig -p '%proc.name %evt.type(%evt.args)' \
    proc.name contains /the/program/of/interest
    
por 17.09.2016 / 17:50

Tags