ฉันจะค้นหาหน่วยความจำรั่วไหลของกระบวนการทำงานได้อย่างไร


19

มีวิธีฉันสามารถค้นหาหน่วยความจำรั่วไหลของกระบวนการทำงานหรือไม่ ฉันสามารถใช้ Valgrind เพื่อค้นหาการรั่วไหลของหน่วยความจำก่อนเริ่มกระบวนการ ฉันสามารถใช้ GDB เพื่อแนบกับกระบวนการทำงาน ฉันจะดีบักการรั่วไหลของหน่วยความจำของกระบวนการทำงานได้อย่างไร


Valgrind มีประโยชน์มากฉันจะเรียกมันว่าสัญชาตญาณ
user400344

คำตอบ:


13

นี่คือขั้นตอนการรับประกันเกือบจะพบว่าใครรั่วหน่วยความจำ:

  1. ค้นหา PID ของกระบวนการที่ทำให้หน่วยความจำรั่ว

    ps -aux
  2. จับภาพและบันทึกลงในไฟล์บางอย่างเช่น/proc/PID/smapsBeforeMemInc.txt

  3. รอจนกว่าหน่วยความจำจะเพิ่มขึ้น
  4. จับภาพอีกครั้ง/proc/PID/smapsและบันทึกได้afterMemInc.txt
  5. ค้นหาความแตกต่างระหว่างที่หนึ่งsmapsและที่smapsสองเช่นกับ

    diff -u beforeMemInc.txt afterMemInc.txt

  6. จดช่วงที่อยู่ที่หน่วยความจำเพิ่มขึ้นตัวอย่างเช่น

       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
  7. ใช้ GDB เพื่อถ่ายโอนข้อมูลหน่วยความจำในกระบวนการทำงานหรือรับ coredump โดยใช้ gcore -o process

  8. ฉันใช้ gdb ในกระบวนการทำงานเพื่อถ่ายโอนข้อมูลหน่วยความจำไปยังไฟล์บางไฟล์

    gdb -p PID
    dump memory ./dump_outputfile.dump 0x2b3289290000 0x2b3289343000
  9. ตอนนี้ใช้stringsคำสั่งหรือhexdump -Cเพื่อพิมพ์dump_outputfile.dump

    strings outputfile.dump
  10. คุณได้รับแบบฟอร์มที่สามารถอ่านได้ซึ่งคุณสามารถค้นหาสตริงเหล่านั้นในซอร์สโค้ดของคุณ

  11. วิเคราะห์แหล่งที่มาของคุณเพื่อค้นหาการรั่วไหล


12

ฉันคิดว่าmemleaxเป็นสิ่งที่คุณต้องการ

มัน debugs การรั่วไหลของหน่วยความจำของกระบวนการทำงานโดยแนบมันโดยไม่ต้องคอมไพล์โปรแกรมใหม่หรือเริ่มกระบวนการเป้าหมายใหม่ สะดวกและเหมาะสมกับสภาพแวดล้อมการผลิต

มันทำงานบน GNU / Linux และ FreeBSD

หมายเหตุ:ฉันเป็นผู้เขียนข้อเสนอแนะใด ๆ ยินดี

== แก้ไข ==

ฉันเขียนlibleakเครื่องมืออื่นซึ่ง hooks ฟังก์ชั่นหน่วยความจำโดย LD_PRELOAD

นอกจากนี้ยังไม่จำเป็นต้องแก้ไขโปรแกรมเป้าหมาย แม้ว่าคุณจะต้องเริ่มต้นความคืบหน้าใหม่ด้วย LD_PRELOAD คุณสามารถเปิด / ปิดการตรวจจับระหว่างการใช้งาน

มีผลกระทบต่อประสิทธิภาพการทำงานน้อยลงมากเนื่องจากไม่มีกับดักสัญญาณ

เปรียบเทียบกับเครื่องมือที่คล้ายกัน (เช่น mtrace) มันพิมพ์ call-stack แบบเต็มที่จุดรั่วหน่วยความจำที่น่าสงสัย


1
ฉันรับรอง memleax เป็นเครื่องมือที่มีประโยชน์มากในการตรวจสอบการรั่วไหลที่เห็นได้ชัด สรุปการส่งออกที่มีประสิทธิภาพที่น่าแปลกใจ เกือบจะเหมือนที่ฉันเขียนถ้าฉันมีพลังในการประมวลผลที่จะทำด้วยตนเอง ขอบคุณสำหรับสิ่งนี้
sehe

6

บน Linux คุณสามารถเปิดใช้งานmtraceในโปรแกรมของคุณ แต่เป็นการเปลี่ยนรหัส

บน OpenBSD คุณสามารถลองสถิติ malloc

เครื่องมือตรวจสอบการรั่วไหลของ Google อาจมีค่าดูและไม่เหมือน mtrace คุณอาจใช้LD_PRELOADเพื่อหลีกเลี่ยงการคอมไพล์ซ้ำได้


0

ฉันคิดว่าหากไม่ให้การสนับสนุนสำหรับการตรวจสอบการจัดสรรหลังจากที่โปรแกรมเริ่มต้นโดยตรงในซอร์สโค้ดคุณไม่มีโชค นี่คือเหตุผลสองประการที่ฉันนึกถึง:

  • ตัวตรวจสอบฮีปเริ่มต้นเมื่อโปรแกรมเริ่มทำงาน บางคนเสนอความสามารถในการปรับแต่งเวลาที่แน่นอน แต่ตัวแปรสภาพแวดล้อมที่เริ่มต้นพวกเขาจะต้องตั้งค่าเมื่อโปรแกรมทำงาน นี่เป็นเพราะพวกเขาเฝ้าดูเพื่อให้แน่ใจว่าการจัดสรรแต่ละครั้งมีการจัดสรรคืนที่สอดคล้องกันและพวกเขาจะพลาดบางอย่าง
  • การตรวจสอบฮีปมักจะต้องใช้สิทธิ์ยกระดับหรือ hooks ที่จะให้ระบบปฏิบัติการ หากไม่มีการระบุ hooks ในเวลาที่เริ่มต้นโปรแกรมตัวตรวจสอบฮีปจะไม่สามารถยกระดับได้ ฉันไม่เชื่อว่า OSes ให้สิทธิพิเศษเหล่านี้หลังจากที่โปรแกรมที่เป็นปัญหาเริ่มต้นขึ้น

อย่างไรก็ตามหากคุณโปรแกรมกำลังทำงานภายในเครื่องเสมือนสภาพแวดล้อมนั้นอาจให้การสนับสนุนสำหรับการตรวจสอบการจัดสรร ฉันรู้ว่า Java มีเครื่องมือตรวจสอบการจัดสรรและการรวบรวมขยะจำนวนมาก (เช่นvisualVM ) ที่แนบมากับโปรแกรมที่กำลังรันหรือ VMs


0

Purifyของ IBM น่าจะเป็นเครื่องมือที่เก่าแก่และทันสมัยที่สุดของทั้งหมด มันจะตั้งค่าสถานะหมายเลขบรรทัดในรหัสซึ่งทำให้หน่วยความจำรั่ว

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