Myślę, że jest to możliwe, jeśli dołączysz proces powiązanego interpretera do gdb. Próbowałem tego z tym linkiem perl
perl -e 'do { print "x\n"; sleep(1) } while(1)'
i działa, ale niestety nie z podobnym skryptem bash.
Przede wszystkim musisz ustalić PID tego procesu, którego wyjście chcesz uchwycić. Następnie uruchom gdbw innym terminalu i wykonaj następujące polecenia gdb
attach PID
call close(2)
call open("/abs/olu/te/path/filename", 65, 384)
detach PID
potem całe dane, które są zapisywane stderrjest przekierowany /abs/olu/te/path/filename, ponieważ
attach PID dołącza proces do gdb i zatrzymuje go
call close(2)zamyka stderrskryptowy skrypt procesu (dla stdoutskryptowego pliku jest 1)
call open(...) otwiera nowy plik i przyjmuje najniższą nieużywaną liczbę całkowitą dla nowo utworzonego skryptu plików i
detach PID kontynuuje proces
Przynajmniej na mojej maszynie. Pierwsze dwie linie są kompatybilne z POSIX, ale nie trzecia.
Drugi i trzeci argument openw trzeciej linii są udokumentowane w man 2 open. W moim przypadku 65 oznacza, że opennależy utworzyć plik i otworzyć plik tylko do zapisu, tj. O_WRONLY | O_CREAT(Zdefiniowany w fcntl.h). Trzeci argument mówi open, aby utworzyć plik z uprawnieniami do odczytu i zapisu dla użytkownika, tj. S_IWUSR | S_IRUSR(Zdefiniowany w sys/stat.h). Może więc musisz samodzielnie znaleźć odpowiednie wartości na swoim komputerze.