วิธีติดตาม / แก้ไขปัญหาเกี่ยวกับหน่วยความจำในรหัส C / C ++ ขนาดใหญ่บนระบบ * nix


9

กลยุทธ์ใดที่คุณใช้ขณะติดตามปัญหาที่เกี่ยวข้องกับหน่วยความจำ เครื่องมือใดที่คุณใช้ (โอเพนซอร์สและกรรมสิทธิ์) เพื่อระบุการรั่วไหลของหน่วยความจำความเสียหายของหน่วยความจำ ฯลฯ คุณจะติดตามการรั่วไหลของหน่วยความจำได้อย่างไรถ้ามีเพียง gdb / dbx ในระบบ?

สำหรับฉันการแก้ไขการรั่วไหลของหน่วยความจำด้วยดีบักเกอร์นั้นยากมาก


2
โดยส่วนตัวฉันคิดว่าคำถามนี้เกี่ยวข้องกับการเขียนโปรแกรมมากกว่ายูนิกซ์ที่เกี่ยวข้อง
phunehehe

คำตอบ:


12

หากคุณสามารถเปลี่ยนซอร์สโค้ดDmallocนั้นยอดเยี่ยม มันจะแสดงว่าตัวชี้ใดที่ไม่เห็นด้วยและ (สำหรับโค้ดที่สร้างด้วยสัญลักษณ์การดีบัก) จะต้องระบุว่าบรรทัดใดที่จัดสรรไว้

ถ้าคุณทำไม่ได้Valgrindเป็นมาตรฐานสำหรับสิ่งนั้น โดยทั่วไปฉันพบว่า Valgrind ใช้งานได้ยากกว่า แต่มีคุณสมบัติมากมายและไม่เกี่ยวข้องกับการเพิ่มการเรียก dmalloc ในรหัสของคุณ


dmalloc ไม่ค่อยมีประสิทธิภาพเท่าที่ควรในระบบที่มีขนาดใหญ่มาก valgrind เป็นเดิมพันที่ดีกว่าและแม้กระทั่งที่นั่นคุณจะตีคอขวด ...

valgrind - เครื่องมือ memcheck "yourapp" จะให้ข้อมูลที่เกี่ยวข้องกับหน่วยความจำในรันไทม์ (มีประโยชน์ในระบบเดสก์ท็อป) เครื่องมือที่ยอดเยี่ยมอีกอันคือmemwatchแต่มันควรจะถูกคอมไพล์พร้อมกับที่มาของคุณ Memwatch สามารถบันทึกรายละเอียดไปยังไฟล์ได้จึงเหมาะสำหรับระบบฝังตัว
rajaganesh87


2

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

ด้วย GDB คุณสามารถลองแนบกับโปรแกรมที่กำลังทำงานและฟังก์ชั่นการโทรเช่น malloc_stats()

หากโปรแกรมของคุณเขียนด้วยภาษาอื่นอาจจะยุ่งยากกว่า เมื่อเร็ว ๆ นี้ GDB บางตัวได้รับการเขียนสคริปต์และผู้คนเริ่มโครงการที่น่าสนใจเช่นgdb-heapซึ่งสามารถวิเคราะห์หน่วยความจำ Python จากคอร์ดัมพ์ สคริปต์ analysys หน่วยความจำที่คล้ายกันอาจเป็นไปได้สำหรับวัตถุ C ++

อ่านเพิ่มเติมที่/programming/2564752/examining-cc-heap-memory-statistics-in-gdb


1

สำหรับ Solaris มีเครื่องมือหลายรายการในคำตอบสำหรับคำถาม StackOverflow (ซึ่งรวมถึงการตรวจสอบการรั่วไหลด้วยการเข้าถึงหน่วยความจำไม่ดีในรูปแบบอื่น)


1

ฉันได้ทำ Objective-C มาระยะหนึ่งแล้วและมีเครื่องวิเคราะห์ที่จัดการกับการจัดการหน่วยความจำระดับ C และสิ่งต่าง ๆ เช่นนั้น Clang Static Analyzerนั้นดีมากที่ Apple ตัดสินใจรวมเข้ากับ xCode IDE ฉันไม่แน่ใจว่าสิ่งนี้ดีสำหรับคำถามของคุณหรือไม่ แต่ถ้าคุณทำ C คุณควรลองทำดู


Minibibble: clang ได้รับการพัฒนาเพื่อใช้ใน xcode ตั้งแต่เริ่มต้น ดูclang.llvm.org/clang_video-05-25-2007.html
Daniel James

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