関連するインタープリターのプロセスをgdbにアタッチすると可能になると思います。このperl one-linerで試しました
perl -e 'do { print "x\n"; sleep(1) } while(1)'
それは機能しますが、残念ながら、同様のbashスクリプトでは機能しません。
まず、出力をキャプチャするプロセスのPIDを把握する必要があります。次にgdb
、別のターミナルで起動し、次のgdbコマンドを実行します
attach PID
call close(2)
call open("/abs/olu/te/path/filename", 65, 384)
detach PID
その後、書き込まれるデータ全体stderr
がにリダイレクトされます/abs/olu/te/path/filename
。
attach PID
プロセスをgdbに接続して停止します
call close(2)
stderr
プロセスのファイル記述子を閉じます(stdout
ファイル記述子が1の場合)
call open(...)
新しいファイルを開き、新しく作成されたファイル記述子の最小の未使用整数を取得し、
detach PID
プロセスを続ける
少なくとも私のマシンでは。最初の2行はPOSIX互換ですが、3行目は互換性がありません。
open
3行目の2番目と3番目の引数は、に記載されていman 2 open
ます。私の場合、65はopen
ファイルを作成し、ファイルを書き込み専用O_WRONLY | O_CREAT
(つまりで定義fcntl.h
)で開くことを意味します。3番目の引数は、ユーザーに対して読み取りおよび書き込み権限を持つファイルを作成するようにopenに指示しますS_IWUSR | S_IRUSR
(例:で定義sys/stat.h
)。したがって、自分でマシンの適切な値を見つける必要があるかもしれません。