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

พื้นฐาน Valgrind

ตรวจจับหน่วยความจำรั่วและข้อผิดพลาด

พื้นฐาน Valgrind เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

Valgrind คืออะไร

วัลกรินด์ เป็นเฟรมเวิร์กสำหรับแทรกการตรวจสอบ เครื่องมือเริ่มต้นของมันคือ เมมเช็ก ซึ่งตรวจจับหน่วยความจำรั่วและข้อผิดพลาดได้โดยไม่ต้องคอมไพล์ใหม่ ด้วยการเรียกใช้โปรแกรมบนซีพียูจำลอง

การเรียกใช้เมมเช็ก

เรียกใช้วัลกรินด์นำหน้าโปรแกรมของคุณ ควรสร้างโปรแกรมด้วย -g ก่อนเพื่อให้มีหมายเลขบรรทัด

g++ -g main.cpp -o app
valgrind --leak-check=full ./app

การตรวจจับหน่วยความจำรั่ว

เมมเช็กจะรายงานหน่วยความจำที่ยังจัดสรรอยู่เมื่อโปรแกรมสิ้นสุด โดยจัดประเภทเป็นสูญหายแน่นอน สูญหายทางอ้อม หรือยังเข้าถึงได้

#include <cstdlib>

int main() {
    int* p = (int*)malloc(40); // never freed -> definitely lost
    return 0;
}

หมวดหมู่หน่วยความจำรั่ว

ทำความเข้าใจหมวดหมู่ในรายงาน

  • สูญหายแน่นอน: ไม่มีตัวชี้เหลืออยู่ เป็นหน่วยความจำรั่วจริง
  • สูญหายทางอ้อม: เข้าถึงได้ผ่านบล็อกที่สูญหายเท่านั้น
  • ยังเข้าถึงได้: มีตัวชี้อยู่เมื่อโปรแกรมสิ้นสุด (มักไม่เป็นปัญหา)

การอ่านและเขียนที่ไม่ถูกต้อง

เมมเช็กจะแจ้งเตือนเมื่อเข้าถึงหน่วยความจำที่ยังไม่ได้จัดสรรหรือถูกคืนแล้ว พร้อมรายงานที่อยู่และขนาด

#include <cstdlib>

int main() {
    int* a = (int*)malloc(2 * sizeof(int));
    a[5] = 1; // invalid write past the block
    free(a);
    return 0;
}

ค่าที่ยังไม่ได้กำหนดค่า

เมมเช็กจะแจ้งเตือนเมื่อเงื่อนไขหรือผลลัพธ์ขึ้นอยู่กับค่าที่ยังไม่ได้กำหนดค่า ซึ่งเป็นแหล่งที่มาที่พบได้บ่อยของข้อบกพร่องที่เกิดขึ้นไม่แน่นอน

#include <iostream>

int main() {
    int x;            // uninitialized
    if (x == 42)      // use of uninitialized value
        std::cout << "hi\n";
    return 0;
}

การอ่านผลลัพธ์

แต่ละบล็อกข้อผิดพลาดจะแสดงการดำเนินการ ร่องรอยสแตกที่เป็นต้นเหตุ และ (สำหรับบล็อกบนฮีป) ตำแหน่งที่จัดสรรหน่วยความจำ HEAP SUMMARY จะแสดงยอดรวมของการจัดสรรและหน่วยความจำรั่ว

ตัวเลือกที่มีประโยชน์

ตัวเลือกที่ใช้บ่อย:

  • --leak-check=full: แสดงรายละเอียดของหน่วยความจำรั่วแต่ละรายการ
  • --show-leak-kinds=all
  • --track-origins=yes: ติดตามค่าที่ยังไม่ได้กำหนดค่ากลับไปยังแหล่งที่มา
  • --error-exitcode=1: ทำให้การผสานรวมอย่างต่อเนื่องล้มเหลวเมื่อพบข้อผิดพลาด

วัลกรินด์เทียบกับเอเอสแซน

ทั้งสองเครื่องมือค้นหาข้อบกพร่องด้านหน่วยความจำได้ แต่มีข้อแลกเปลี่ยนต่างกัน

  • วัลกรินด์: ไม่ต้องคอมไพล์ใหม่ แต่ช้ากว่า (10–50 เท่า) และตรวจจับการอ่านค่าที่ยังไม่ได้กำหนดค่าได้ดี
  • เอเอสแซน: ต้องคอมไพล์ใหม่ แต่เร็วกว่าอย่างมาก และตรวจจับสแตกล้นขอบเขตได้ดีกว่า

การระงับปัญหาที่ทราบแล้ว

ไลบรารีจากบุคคลที่สามอาจสร้างข้อความรบกวน สร้างและใช้ไฟล์ระงับด้วย --gen-suppressions=all และ --suppressions=file เพื่อปิดรายงานที่ทราบว่าไม่เป็นอันตราย

ควรใช้วัลกรินด์เมื่อใด

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

ตรวจสอบอย่างรวดเร็ว

ทบทวนหมวดหมู่หน่วยความจำรั่ว

สรุปทบทวน

คุณได้เรียนรู้พื้นฐานของวัลกรินด์

  • เมมเช็กค้นหาหน่วยความจำรั่ว การเข้าถึงที่ไม่ถูกต้อง และการอ่านค่าที่ยังไม่ได้กำหนดค่า โดยไม่ต้องคอมไพล์ใหม่
  • เรียกใช้ด้วย --leak-check=full --track-origins=yes
  • ประเภทหน่วยความจำรั่ว: สูญหายแน่นอน สูญหายทางอ้อม และยังเข้าถึงได้
  • ช้ากว่าเอเอสแซน แต่เหมาะอย่างยิ่งสำหรับข้อบกพร่องจากค่าที่ยังไม่ได้กำหนดค่า

คำถามที่พบบ่อย

บทเรียน “พื้นฐาน Valgrind” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “พื้นฐาน Valgrind” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐาน Valgrind”

ตรวจจับหน่วยความจำรั่วและข้อผิดพลาด คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “พื้นฐาน Valgrind” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. การใช้ gdb และ lldb
  2. AddressSanitizer
  3. UBSan และ TSan
  4. พื้นฐาน Valgrind
← กลับไปที่ C++ Academy