มีวิธีฉันสามารถค้นหาหน่วยความจำรั่วไหลของกระบวนการทำงานหรือไม่ ฉันสามารถใช้ Valgrind เพื่อค้นหาการรั่วไหลของหน่วยความจำก่อนเริ่มกระบวนการ ฉันสามารถใช้ GDB เพื่อแนบกับกระบวนการทำงาน ฉันจะดีบักการรั่วไหลของหน่วยความจำของกระบวนการทำงานได้อย่างไร
มีวิธีฉันสามารถค้นหาหน่วยความจำรั่วไหลของกระบวนการทำงานหรือไม่ ฉันสามารถใช้ Valgrind เพื่อค้นหาการรั่วไหลของหน่วยความจำก่อนเริ่มกระบวนการ ฉันสามารถใช้ GDB เพื่อแนบกับกระบวนการทำงาน ฉันจะดีบักการรั่วไหลของหน่วยความจำของกระบวนการทำงานได้อย่างไร
คำตอบ:
ค้นหา PID ของกระบวนการที่ทำให้หน่วยความจำรั่ว
ps -aux
จับภาพและบันทึกลงในไฟล์บางอย่างเช่น/proc/PID/smaps
BeforeMemInc.txt
/proc/PID/smaps
และบันทึกได้afterMemInc.txt
ค้นหาความแตกต่างระหว่างที่หนึ่งsmaps
และที่smaps
สองเช่นกับ
diff -u beforeMemInc.txt afterMemInc.txt
จดช่วงที่อยู่ที่หน่วยความจำเพิ่มขึ้นตัวอย่างเช่น
beforeMemInc.txt afterMemInc.txt
---------------------------------------------------
2b3289290000-2b3289343000 2b3289290000-2b3289343000 #ADDRESS
Shared_Clean: 0 kB Shared_Clean: 0 kB
Shared_Dirty: 0 kB Shared_Dirty: 0 kB
Private_Clean: 0 kB Private_Clean: 0 kB
Private_Dirty: 28 kB Private_Dirty: 36 kB
Referenced: 28 kB Referenced: 36 kB
Anonymous: 28 kB Anonymous: 36 kB #INCREASE MEM
AnonHugePages: 0 kB AnonHugePages: 0 kB
Swap: 0 kB Swap: 0 kB
KernelPageSize: 4 kB KernelPageSize: 4 kB
MMUPageSize: 4 kB MMUPageSize: 4 kB
Locked: 0 kB Locked: 0 kB
VmFlags: rd wr mr mw me ac VmFlags: rd wr mr mw me ac
ใช้ GDB เพื่อถ่ายโอนข้อมูลหน่วยความจำในกระบวนการทำงานหรือรับ coredump โดยใช้ gcore -o process
ฉันใช้ gdb ในกระบวนการทำงานเพื่อถ่ายโอนข้อมูลหน่วยความจำไปยังไฟล์บางไฟล์
gdb -p PID
dump memory ./dump_outputfile.dump 0x2b3289290000 0x2b3289343000
ตอนนี้ใช้strings
คำสั่งหรือhexdump -C
เพื่อพิมพ์dump_outputfile.dump
strings outputfile.dump
คุณได้รับแบบฟอร์มที่สามารถอ่านได้ซึ่งคุณสามารถค้นหาสตริงเหล่านั้นในซอร์สโค้ดของคุณ
วิเคราะห์แหล่งที่มาของคุณเพื่อค้นหาการรั่วไหล
ฉันคิดว่าmemleaxเป็นสิ่งที่คุณต้องการ
มัน debugs การรั่วไหลของหน่วยความจำของกระบวนการทำงานโดยแนบมันโดยไม่ต้องคอมไพล์โปรแกรมใหม่หรือเริ่มกระบวนการเป้าหมายใหม่ สะดวกและเหมาะสมกับสภาพแวดล้อมการผลิต
มันทำงานบน GNU / Linux และ FreeBSD
หมายเหตุ:ฉันเป็นผู้เขียนข้อเสนอแนะใด ๆ ยินดี
== แก้ไข ==
ฉันเขียนlibleakเครื่องมืออื่นซึ่ง hooks ฟังก์ชั่นหน่วยความจำโดย LD_PRELOAD
นอกจากนี้ยังไม่จำเป็นต้องแก้ไขโปรแกรมเป้าหมาย แม้ว่าคุณจะต้องเริ่มต้นความคืบหน้าใหม่ด้วย LD_PRELOAD คุณสามารถเปิด / ปิดการตรวจจับระหว่างการใช้งาน
มีผลกระทบต่อประสิทธิภาพการทำงานน้อยลงมากเนื่องจากไม่มีกับดักสัญญาณ
เปรียบเทียบกับเครื่องมือที่คล้ายกัน (เช่น mtrace) มันพิมพ์ call-stack แบบเต็มที่จุดรั่วหน่วยความจำที่น่าสงสัย
บน Linux คุณสามารถเปิดใช้งานmtraceในโปรแกรมของคุณ แต่เป็นการเปลี่ยนรหัส
บน OpenBSD คุณสามารถลองสถิติ malloc
เครื่องมือตรวจสอบการรั่วไหลของ Google อาจมีค่าดูและไม่เหมือน mtrace คุณอาจใช้LD_PRELOAD
เพื่อหลีกเลี่ยงการคอมไพล์ซ้ำได้
ฉันคิดว่าหากไม่ให้การสนับสนุนสำหรับการตรวจสอบการจัดสรรหลังจากที่โปรแกรมเริ่มต้นโดยตรงในซอร์สโค้ดคุณไม่มีโชค นี่คือเหตุผลสองประการที่ฉันนึกถึง:
อย่างไรก็ตามหากคุณโปรแกรมกำลังทำงานภายในเครื่องเสมือนสภาพแวดล้อมนั้นอาจให้การสนับสนุนสำหรับการตรวจสอบการจัดสรร ฉันรู้ว่า Java มีเครื่องมือตรวจสอบการจัดสรรและการรวบรวมขยะจำนวนมาก (เช่นvisualVM ) ที่แนบมากับโปรแกรมที่กำลังรันหรือ VMs
Purifyของ IBM น่าจะเป็นเครื่องมือที่เก่าแก่และทันสมัยที่สุดของทั้งหมด มันจะตั้งค่าสถานะหมายเลขบรรทัดในรหัสซึ่งทำให้หน่วยความจำรั่ว