การอ่านรายงาน
ตีความข้อมูลส่งออก
การอ่านรายงาน เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน
โครงสร้างของรายงาน
รายงานของ Valgrind มีสามส่วน:
- คำนำหน้าหมายเลขกระบวนการในทุกบรรทัด
- บล็อกข้อผิดพลาดหนึ่งบล็อกหรือมากกว่าตามลำดับที่เกิดขึ้น
- สรุป HEAP และ LEAKตอนโปรแกรมสิ้นสุด
การเรียนรู้วิธีอ่านแต่ละส่วนจะเปลี่ยนข้อความจำนวนมากให้กลายเป็นรายการสิ่งที่ต้องทำที่ชัดเจน
คำนำหน้า PID
ทุกบรรทัดของ Valgrind เริ่มต้นด้วย ==PID== ตัวอย่างเช่น ==12345==
นี่คือ ID ของกระบวนการ ไม่ใช่ส่วนหนึ่งของเอาต์พุตจากโปรแกรมของคุณ ช่วยให้คุณแยกข้อความของ Valgrind ออกจาก printf ของโปรแกรมได้เมื่อทั้งสองใช้เทอร์มินัลร่วมกัน
==12345== Memcheck, a memory error detector
==12345== Command: ./prog
==12345==ตัวอย่างบล็อกข้อผิดพลาด
นี่คือตัวอย่างบล็อกการเขียนที่ไม่ถูกต้องจากการทำงานจริง:
==12345== Invalid write of size 4==12345== at 0x4005A1: main (prog.c:6)==12345== Address 0x520304c is 0 bytes after a block of size 20 alloc'd==12345== at 0x4838B40: malloc==12345== by 0x40058E: main (prog.c:5)
อ่านบรรทัดแรก
บรรทัดแรกระบุชนิดและขนาดของข้อผิดพลาด: 'Invalid write of size 4'
ขนาด 4 หมายถึงการเข้าถึงข้อมูลขนาด 4 ไบต์ ซึ่งโดยทั่วไปคือ int เพียงบรรทัดเดียวนี้ก็บอกประเภทของข้อผิดพลาดที่ควรคาดไว้ได้ ก่อนที่คุณจะอ่านต่อ
อ่านแทรซย้อนกลับของสแตก
บรรทัด at คือเฟรมด้านในสุด ซึ่งเป็นจุดที่ข้อผิดพลาดเกิดขึ้น ส่วนแต่ละบรรทัด by คือผู้เรียกที่อยู่สูงขึ้นไปอีกหนึ่งระดับ
ให้อ่านจากบนลงล่าง โดยเริ่มจากจุดที่อยู่ลึกที่สุดไปยังจุดที่อยู่ตื้นที่สุด เฟรมแรกที่มีชื่อไฟล์ของคุณมักเป็นจุดที่เกิดข้อผิดพลาด
==12345== at 0x4005A1: do_work (work.c:12)
==12345== by 0x4006F0: main (main.c:8)อ่านหมายเหตุเกี่ยวกับแอดเดรส
บรรทัด Address ... ระบุตำแหน่งการเข้าถึงเมื่อเทียบกับบล็อกที่ทราบตำแหน่ง:
0 bytes after a block of size 20 alloc'd— เขียนเกินขอบเขตถัดจากจุดสิ้นสุดพอดี4 bytes inside a block of size 4 free'd— ใช้งานหลังคืนหน่วยความจำon thread 1's stack— การเข้าถึงสแตก
รายงานยังแสดงตำแหน่งที่บล็อกนั้นถูกจัดสรรหรือคืนหน่วยความจำด้วย
สรุป HEAP
เมื่อโปรแกรมสิ้นสุด คุณจะได้รับข้อมูลการจัดสรรหน่วยความจำ:
==12345== HEAP SUMMARY:==12345== in use at exit: 20 bytes in 1 blocks==12345== total heap usage: 3 allocs, 2 frees, 1,044 bytes allocated
หาก 'in use at exit' มีค่ามากกว่าศูนย์ หมายความว่ายังมีบางสิ่งที่ไม่ได้คืนหน่วยความจำ
สรุป LEAK
ใต้สรุปฮีป รายการหน่วยความจำรั่วจะถูกจัดกลุ่ม:
definitely lost: 20 bytes in 1 blocksindirectly lost: 0 bytes in 0 blockspossibly lost: 0 bytes in 0 blocksstill reachable: 0 bytes in 0 blocks
เพิ่ม --leak-check=full เพื่อแนบแทรซให้กับแต่ละบล็อกที่สูญหาย
สรุป ERROR
บรรทัดสุดท้ายจะนับทุกอย่าง:
ERROR SUMMARY: 2 errors from 2 contexts
'บริบท' คือ ตำแหน่งข้อผิดพลาดที่ไม่ซ้ำกัน หากบรรทัดที่มีข้อผิดพลาดทำงานในลูปหนึ่งล้านครั้ง ก็ยังถือเป็นบริบทเดียว เป้าหมายของคุณคือ 0 errors from 0 contexts
ลำดับการคัดแยกปัญหา
จัดการรายงานอย่างเป็นระบบ:
- แก้ไขข้อผิดพลาดจากการเข้าถึงที่ไม่ถูกต้องก่อน เพราะทำให้ข้อมูลเสียหาย
- จากนั้นแก้ไขข้อผิดพลาดจากค่าที่ยังไม่ได้กำหนดค่า
- ต่อด้วยหน่วยความจำรั่วที่สูญหายแน่นอนและสูญหายทางอ้อม
- เรียกใช้โปรแกรมอีกครั้งหลังแก้ไขแต่ละจุด สาเหตุรากเดียวมักทำให้รายงานหลายรายการหายไป
การระงับเสียงรบกวนที่ทราบสาเหตุ
ข้อผิดพลาดบางอย่างมาจากไลบรารีที่คุณแก้ไขไม่ได้ เช่น รันไทม์ของ C หรือไดรเวอร์กราฟิก ให้สร้างไฟล์ระงับเพื่อซ่อนข้อความเหล่านั้น โดยไม่ปิดบังข้อผิดพลาดของคุณเอง
--gen-suppressions=all จะแสดงรายการการระงับที่พร้อมใช้งาน ซึ่งคุณสามารถบันทึกไว้และส่งกลับด้วย --suppressions=file
valgrind --gen-suppressions=all ./prog
valgrind --suppressions=mine.supp ./progตรวจสอบอย่างรวดเร็ว
ตีความบรรทัดหนึ่งของรายงาน
สรุปทบทวน
ขณะนี้คุณสามารถอ่านรายงานของ Valgrind ได้ตั้งแต่ต้นจนจบ:
==PID==เป็นคำนำหน้าบรรทัดของ Valgrind เพื่อแยกออกจากเอาต์พุตของโปรแกรม- แต่ละบล็อกข้อผิดพลาดจะระบุชนิด ขนาด แทรซย้อนกลับของสแตก และหมายเหตุเกี่ยวกับแอดเดรส
- สรุป HEAP/LEAK จะแสดงบัญชีการจัดสรรและหน่วยความจำที่สูญหาย
- สรุป ERROR จะนับบริบทที่ไม่ซ้ำกัน โดยมีเป้าหมายเป็นศูนย์
คัดแยกข้อผิดพลาดจากการเข้าถึงก่อน แล้วจึงจัดการหน่วยความจำรั่ว โดยเรียกใช้โปรแกรมใหม่ระหว่างทาง
คำถามที่พบบ่อย
บทเรียน “การอ่านรายงาน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การอ่านรายงาน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การอ่านรายงาน”
ตีความข้อมูลส่งออก คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การอ่านรายงาน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม
ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ