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 gdb
w 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 stderr
jest przekierowany /abs/olu/te/path/filename
, ponieważ
attach PID
dołącza proces do gdb i zatrzymuje go
call close(2)
zamyka stderr
skryptowy skrypt procesu (dla stdout
skryptowego 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 open
w trzeciej linii są udokumentowane w man 2 open
. W moim przypadku 65 oznacza, że open
należ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.