ฉันคิดว่าเป็นไปได้ถ้าคุณแนบกระบวนการของล่ามที่เกี่ยวข้องกับ 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)
ปิดstderr
filescriptor ของกระบวนการ (สำหรับstdout
filescriptor คือ 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
) ดังนั้นคุณอาจต้องค้นหาค่าที่เหมาะสมในเครื่องของคุณด้วยตัวเอง