Parece que as instruções dadas para gdb
estão incorretas e incompletas de várias maneiras.
Primeiro, você precisa usar
gdb [executablefile] [pid]
para que o GDB saiba o que o programa está conectando na verdade é . Acabei de testar isso e ele pode usar um executável despojado. Observe que, enquanto o gdb estiver anexado ao processo, o processo será suspenso. Se esse processo estiver se comunicando por uma rede, digite rapidamente ou a conexão de rede provavelmente expirará.
Em segundo lugar, os comandos fornecidos não explicam o que estão fazendo, e a instrução que você deve digitar "para um diretório no qual deseja que o seu programa grave arquivos" está errada, já que O gdb está pedindo ao programa original para executar a função creat()
. O exemplo fornecido criará os arquivos myprog.stderr e myprog.stdout no diretório de trabalho atual do programa em execução, não no diretório em que você executou o gdb. Use nomes de caminhos absolutos aqui se você não souber qual é o CWD do programa (ou veja ls -l /proc/[pid]/cwd
).
Em terceiro lugar, com a falta de explicação, é importante saber que o primeiro parâmetro para dup2()
é o número do descritor de arquivo retornado pelo creat()
anterior, portanto, se esse programa em execução tiver vários arquivos abertos, você pode acabar uma troca como
(gdb) call creat("/home/me/myprog.stdout",0600)
$1 = 7
(gdb) call dup2(7,1)
$2 = 1
(gdb) call creat("/home/me/myprog.stderr",0600)
$3 = 8
(gdb) call dup2(8,2)
$4 = 2
Quando você sair do gdb, ele perguntará se você deseja "sair de qualquer maneira (e desconectá-lo)". A resposta é sim.
Por fim, bg
e disown
são bash builtins. Se você não estava usando bash, então você está por conta própria a partir daqui. bg
move um trabalho suspenso para o segundo plano como se ele fosse iniciado usando somecommand &
, e disown
remove o programa da lista de programas ativos do bash para SIGHUP quando o bash sai.