ฉันคิดว่าเป็นไปได้ถ้าคุณแนบกระบวนการของล่ามที่เกี่ยวข้องกับ gdb ฉันลองด้วย perl one-liner
perl -e 'do { print "x\n"; sleep(1) } while(1)'
และใช้งานได้ แต่น่าเสียดายที่ไม่มีสคริปต์ทุบตีคล้าย
ก่อนอื่นคุณต้องหา 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)ปิดstderrfilescriptor ของกระบวนการ (สำหรับstdoutfilescriptor คือ 1)
call open(...) เปิดไฟล์ใหม่และรับจำนวนเต็มที่ไม่ได้ใช้ต่ำสุดสำหรับไฟล์ที่สร้างขึ้นใหม่และ
detach PID ดำเนินการต่อกระบวนการ
อย่างน้อยในเครื่องของฉัน สองบรรทัดแรกเข้ากันได้กับ POSIX แต่ไม่ใช่บรรทัดที่สาม
อาร์กิวเมนต์ที่สองและอาร์กิวเมนต์ที่สามของopenในบรรทัดที่สามมีการบันทึกman 2 openไว้ ในกรณีของฉัน 65 หมายความว่าopenควรสร้างไฟล์และเปิดไฟล์แบบเขียนอย่างเดียวO_WRONLY | O_CREAT(กำหนดไว้ในfcntl.h) อาร์กิวเมนต์ที่สามบอกให้เปิดเพื่อสร้างไฟล์ที่มีสิทธิ์ในการอ่านและเขียนสำหรับผู้ใช้เช่นS_IWUSR | S_IRUSR(กำหนดไว้ในsys/stat.h) ดังนั้นคุณอาจต้องค้นหาค่าที่เหมาะสมในเครื่องของคุณด้วยตัวเอง