การถ่ายโอนข้อมูลหลักกระบวนการโดยไม่ฆ่ากระบวนการ


12

มีวิธีรับ core dump (หรือคล้ายกัน) สำหรับกระบวนการโดยไม่ฆ่ากระบวนการจริงหรือไม่ ฉันมีกระบวนการหลามแบบมัลติเธรดที่ทำงานบนระบบฝังตัว และฉันต้องการที่จะได้ภาพรวมของกระบวนการภายใต้สภาวะปกติ (เช่นกับกระบวนการอื่น ๆ ที่จำเป็นต้องใช้) แต่ฉันไม่มีหน่วยความจำเพียงพอที่จะเชื่อมต่อ gdb (หรือเรียกใช้ภายใต้ gdb) โดยไม่ต้องใช้กระบวนการหลาม เป็นคนเดียวที่ทำงาน

ฉันหวังว่าคำถามนี้สมเหตุสมผล


หากนี่เป็นเพียงในขณะที่คุณกำลังดีบั๊กคุณคิดว่าเป็นสิ่งที่บ้าเช่น swap ในไฟล์ NFS หรืออุปกรณ์บล็อกเครือข่ายหรือไม่?
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


13

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

from os import fork, abort
(...)
def onUSR1(sig, frame):
    if os.fork == 0:
        os.abort

และระหว่างการเริ่มต้น

from signal import signal, SIGUSR1
from wherever import onUSR1
(...)
signal.signal(signal.SIGUSR1, wherever.onUSR1)

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

กาลครั้งหนึ่งใช้เคล็ดลับนี้กับโปรแกรมที่เรียกว่าundumpสร้างไฟล์ปฏิบัติการจากคอร์ดัมพ์เพื่อบันทึกภาพหลังจากการเริ่มต้นที่ซับซ้อน ที่ใช้ในการทำเช่นนี้เพื่อสร้างภาพที่โหลดไว้จากemacstemacs


5

gcoreคุณอาจจะลองใช้ นั่นเป็นตัวเลือกสำหรับคุณหรือไม่?


ในบางจุด gcore เป็นโปรแกรมแบบสแตนด์อะโลน แต่ฉันไม่คิดว่ามันเป็นส่วนหนึ่งของแพ็คเกจ gdb อีกต่อไป - อย่างไรก็ตามคุณสามารถเรียกใช้ gdb --pid = <PID> จากนั้นใช้คำสั่ง gcore เพื่อถ่ายโอนไฟล์หลัก gcore.c เป็นโปรแกรมที่ค่อนข้างง่ายและสามารถ googlable ได้ง่ายหากคุณต้องการอะไรที่มีน้ำหนักเบากว่า
synthesizerpatel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.