ไม่มีการปิดกั้นการถ่ายโอนข้อมูลหลักบน Linux?


24

ฉันกำลังมองหาวิธีที่จะใช้ coredump ที่ไม่ล่วงล้ำของกระบวนการทำงานบน Linux

ฉันคุ้นเคยกับ gdb gcoreแต่สามารถทำงานได้เมื่อgdbเชื่อมต่อกับกระบวนการและหยุดการดีบักเท่านั้น สำหรับดัมพ์หลักขนาดใหญ่ที่อาจหมายถึงหลายวินาทีหรือแม้กระทั่งสองสามนาทีของการประมวลผลที่ถูกขัดจังหวะ

มีทางเลือกที่ไม่มีการบล็อกหรือไม่?

ลินุกซ์สนับสนุนคัดลอกเมื่อเขียนหน่วยความจำซึ่งมันต้องอาศัยการสนับสนุนโดยไม่ต้องfork() exec()ดังนั้นฉันจึงคิดถึงสิ่งที่ระดับเคอร์เนลซึ่งเคอร์เนลใช้สแนปช็อต copy-on-write ของตารางหน้ากระบวนการของกระบวนการที่ถูกเททิ้งแล้วเขียนแกนออกในขณะที่กระบวนการดั้งเดิมยังคงทำงานอยู่

ฉันค่อนข้างมั่นใจว่าฉันสามารถใช้gdbเพื่อบังคับเด็กfork()แล้วทิ้งในขณะที่ผู้ปกครองดำเนินการอย่างมีความสุขจากนั้นwait()ในผู้ปกครองเพื่อเก็บเกี่ยวเด็กหลังจากการเลิกจ้าง แม้ว่าจะยุ่งและยังคงต้องมีการขัดจังหวะสองขั้นตอนของกระบวนการหลักแม้ว่าจะเป็นกระบวนการสั้น

แน่นอนว่ามีคนต้องการสิ่งนี้มาก่อนหรือไม่


ฉันขอโทษที่ฉันสามารถให้ upvote เดียวสำหรับคำถามที่ยอดเยี่ยมนี้
peterh กล่าวว่าคืนสถานะโมนิก้า

คำถามที่ยอดเยี่ยมและฉันหนึ่งกำลังรอคำตอบ +1 จากฉัน
thanasisk

1
สิ่งที่เกี่ยวกับ 1) การแนบกระบวนการด้วย gdb 2) ปล่อยให้มันถูกแยกโดยคำสั่ง "call fork" 3) ทิ้งแกนหลักของกระบวนการลูกที่ 4) ปล่อยให้เด็กที่ตายแล้วรอโดยผู้ปกครอง (อีกคน "รอสาย 4") 5 ) แยกออกจากกระบวนการ 6) อัตโนมัติ 1-5 หรือไม่ Gdb ใช้การเรียกระบบแบบง่าย ๆ ของ sys_ptrace () อาจเป็นเครื่องมือ C ที่ไม่ซับซ้อนอย่างแท้จริงโดยอิสระจาก gdb
peterh กล่าวว่าคืนสถานะโมนิก้า

1
บนเครื่องเสมือนคุณสามารถถ่ายภาพและนำมาเป็นโคลนเพื่อทำการวิเคราะห์ บางทีอาจจะเป็นหนึ่งในเครื่องมือที่อยู่ที่นี่จะช่วยให้คุณ: cyberciti.biz/programming/linux-memory-forensics-analysis-tools
จิโอวานนี่ Tirloni

1
คุณสามารถหลีกเลี่ยงการขัดจังหวะครั้งที่สองโดยให้กระบวนการลูกแยกออกจากกันด้วย จากนั้นกระบวนการผู้ปกครองสามารถรอให้เด็กทันทีและดำเนินการต่อในขณะที่ปู่ย่าตายายทิ้ง
kasperd

คำตอบ:


1

Google CoreDumperเป็นที่สนใจ มันทำสำเนาคัดลอกเมื่อเขียนของพื้นที่ที่อยู่ของกระบวนการให้ดูที่WriteCoreDump () (ดู "หมายเหตุ")


นั่นดูมีประโยชน์เหลือเกิน! ฉันสงสัยว่าเทคนิคพื้นฐานที่ใช้คืออะไร สันนิษฐานว่าเป็นกระบวนการที่น่าสนใจ แต่การสร้างสแน็ปช็อต CoW โดยไม่มีการฟอร์กและวิธีที่ไม่ส่งผลกระทบต่อสแต็กจะเป็นสิ่งที่ท้าทาย ฉันจะต้องดูรหัส สุดยอดเคล็ดลับ
Craig Ringer

ดูเหมือนว่าอยู่ระหว่างดำเนินการเท่านั้นขออภัยและไม่สามารถเรียกใช้ผ่าน gdb หรือคล้ายกันได้เนื่องจากต้องใช้ ptrace ด้วยตนเอง ดังนั้นมันจึงค่อนข้างเหมือนกับ debughelp DLL ใน Windows แทนที่จะเป็น gcore ที่ไม่มีการบล็อก แต่ก็ยังดูมีประโยชน์มาก ฉันเดาว่ามันจะเป็นไปได้ที่จะใช้ผ่านตะขอ LD_PRELOAD และการตั้งค่าตัวจัดการสัญญาณด้วย gdb, detach และส่งสัญญาณกระบวนการ แต่ดูเหมือนว่ามันไม่ได้ออกแบบมาเพื่อทิ้งโปรแกรมที่ไม่ได้แก้ไขและมันมีปัญหาที่ใช้ร่วมกัน โดยเครื่องมือการถ่ายโอนข้อมูลในกระบวนการใด ๆ ที่หากกระบวนการเกิดความยุ่งเหยิงพอที่การถ่ายโอนข้อมูลจะไม่ทำงาน
Craig Ringer

ขออภัย…ฉันพลาดบิต "ไม่ล่วงล้ำ" เมื่อฉันอ่านคำถามครั้งแรก
EricM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.