Ich halte es für möglich, wenn Sie den Prozess des zugehörigen Interpreters an gdb anhängen. Ich habe es mit diesem Perl-Einzeiler versucht
perl -e 'do { print "x\n"; sleep(1) } while(1)'
und es funktioniert aber leider nicht mit einem ähnlichen bash script.
Zunächst müssen Sie die PID des Prozesses ermitteln, dessen Ausgabe Sie erfassen möchten. Starten Sie dann gdb
in einem anderen Terminal und führen Sie die folgenden gdb-Befehle aus
attach PID
call close(2)
call open("/abs/olu/te/path/filename", 65, 384)
detach PID
danach werden die gesamten Daten, in die geschrieben stderr
wird, weitergeleitet /abs/olu/te/path/filename
, da
attach PID
Hängt den Prozess an gdb an und stoppt ihn
call close(2)
schließt den stderr
Filedescriptor des Prozesses (für stdout
den Filedescriptor ist 1)
call open(...)
öffnet eine neue Datei und verwendet die niedrigste nicht verwendete Ganzzahl für den neu erstellten Filedescriptor und
detach PID
setzt den Prozess fort
Zumindest auf meiner Maschine. Die ersten beiden Zeilen sind POSIX-kompatibel, die dritte jedoch nicht.
Das zweite und das dritte Argument open
in der dritten Zeile sind in dokumentiert man 2 open
. In meinem Fall bedeutet 65, dass open
die Datei erstellt und die Datei schreibgeschützt geöffnet werden soll, dh O_WRONLY | O_CREAT
(definiert in fcntl.h
). Das dritte Argument weist open an, die Datei mit Lese- und Schreibberechtigung für den Benutzer zu erstellen, dh S_IWUSR | S_IRUSR
(definiert in sys/stat.h
). Vielleicht müssen Sie die entsprechenden Werte an Ihrer Maschine selbst herausfinden.