0Pricing
C Academy · บทเรียน

การอ่านรายงาน

ตีความข้อมูลส่งออก

การอ่านรายงาน เป็นบทเรียน 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 blocks
indirectly lost: 0 bytes in 0 blocks
possibly lost: 0 bytes in 0 blocks
still 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เหตุใดจึงใช้ Valgrind
  2. การตรวจจับหน่วยความจำรั่ว
  3. การเข้าถึงที่ไม่ถูกต้อง
  4. การอ่านรายงาน
← กลับไปที่ C Academy