วิธีตรวจจับหน่วยความจำรั่วใน C/C++ ด้วย Valgrind

Withi Trwc Cab Hnwy Khwam Ca Raw Ni C C Dwy Valgrind



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

เมื่อคุณรันโปรแกรมภายใต้ Valgrind โปรแกรมจะวัดความสามารถในการปฏิบัติการของโปรแกรมแบบไดนามิก ทำให้สามารถตรวจสอบการใช้งานหน่วยความจำและพฤติกรรมการทำงานของโปรแกรมได้

หน่วยความจำรั่วใน C ++

สิ่งสำคัญที่ควรทราบก็คือ Valgrind ได้รับการออกแบบมาสำหรับโปรแกรม C และ C++ เป็นหลัก และอาจทำงานได้ไม่มีประสิทธิภาพกับภาษาอื่นหรือในทุกสถานการณ์ นอกจากนี้ การรันโปรแกรมภายใต้ Valgrind อาจทำให้การดำเนินการช้าลงอย่างมาก ดังนั้นจึงมักใช้ในระหว่างการพัฒนาและการดีบักมากกว่าในสภาพแวดล้อมการใช้งานจริง







เมื่อหน่วยความจำที่สร้างขึ้นแบบไดนามิกไม่ได้รับการเผยแพร่อย่างเหมาะสม อาจทำให้หน่วยความจำรั่วไหลใน C/C++ ซึ่งจะค่อยๆ ระบายทรัพยากรหน่วยความจำที่มีอยู่ ซึ่งอาจส่งผลให้มีการใช้หน่วยความจำมากเกินไปและประสิทธิภาพของโปรแกรมลดลง



การติดตั้งวาลกริด

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



$ ซูโดะ ปรับปรุงฉลาด

ใช้ตัวจัดการแพ็คเกจเพื่อติดตั้ง Valgrind ขอย้ำอีกครั้งว่าคำสั่งอาจแตกต่างกันไปขึ้นอยู่กับการกระจาย Linux ของคุณ ใช้คำสั่งต่อไปนี้สำหรับระบบที่ใช้ Ubuntu และ Debian:





$ ซูโดะ ฉลาด ติดตั้ง ประตูการเลือกตั้ง

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



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

$ ประตูการเลือกตั้ง --รุ่น

คำสั่งนี้จะแสดงข้อมูลเวอร์ชันของ Valgrind หากติดตั้งสำเร็จ

แค่นั้นแหละ! ตอนนี้ควรติดตั้ง Valgrind บนระบบ Linux ของคุณแล้ว และคุณสามารถใช้มันเพื่อวิเคราะห์และแก้ไขข้อบกพร่องของโปรแกรม C/C++ สำหรับหน่วยความจำรั่วและปัญหาอื่นๆ ได้

การสร้างไฟล์ใน Ubuntu

ในการเริ่มทำงานกับโปรแกรม เราต้องสร้างไฟล์ใน Ubuntu ก่อน สำหรับการสร้างไฟล์ เราใช้โปรแกรมแก้ไขข้อความนาโน ดังนั้นเราจึงเขียนคำสั่งบนเทอร์มินัลดังนี้:

$ นาโน ไฟล์1

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

เมื่อคุณรันคำสั่ง ตัวแก้ไขนาโนจะเปิดขึ้น โดยจะมีพื้นที่ว่างให้คุณป้อนหรือแก้ไขเนื้อหาของไฟล์ “file1” คุณสามารถเริ่มพิมพ์หรือวางเนื้อหาที่มีอยู่ลงในตัวแก้ไขได้

เมื่อบรรลุข้อกำหนดเบื้องต้นทั้งหมดแล้ว เราจึงสร้างตัวอย่างเพื่อใช้ Valgrind เพื่อตรวจจับหน่วยความจำรั่วในโปรแกรม C++

ตัวอย่างที่ 1:

ตัวอย่างแรกที่เราจัดเตรียมไว้ให้สาธิตตัวอย่างง่ายๆ ของการจัดสรรหน่วยความจำแบบไดนามิกโดยใช้ฟังก์ชัน “malloc” จากไลบรารี ใน C

#รวม

ภายใน หลัก ( )

{

ถ่าน * = มอลลอค ( 102 ) ;

กลับ 0 ;

}

นี่คือรายละเอียดของรหัส:

ขั้นแรกเราจะรวมไฟล์ส่วนหัวไลบรารีมาตรฐาน ซึ่งมีฟังก์ชันเช่น malloc สำหรับการจัดสรรหน่วยความจำแบบไดนามิกและการจัดสรรคืน

บรรทัด int main() ประกาศฟังก์ชันหลัก จากนั้น char *a = malloc(102); ประกาศตัวแปรพอยน์เตอร์ “a” ประเภท char* (ตัวชี้ไปที่ถ่าน) ใช้ฟังก์ชัน 'malloc' เพื่อจัดสรรหน่วยความจำแบบไดนามิกสำหรับอาร์เรย์ขององค์ประกอบถ่าน 102 ตัว (รวมทั้งหมด 102 ไบต์) ขนาดการจัดสรรหน่วยความจำ แสดงเป็นไบต์ จะถูกส่งเป็นอินพุตไปยังฟังก์ชัน malloc และส่งออกพอยน์เตอร์ไปยังบล็อกหน่วยความจำที่สร้างขึ้นใหม่ ตัวชี้ถ่าน* “a” ได้รับการกำหนดค่าตัวชี้นี้ สุดท้าย 'ส่งคืน 0;' หมายถึงจุดสิ้นสุดของฟังก์ชันหลัก

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

เมื่อเรารันโปรแกรมนี้ผ่าน Valgrind ด้วยตัวเลือก “–leak-check=full” โปรแกรมจะทำการตรวจสอบหน่วยความจำรั่วและจัดทำรายงานเอาต์พุต

รายงานเอาต์พุตที่จัดทำโดย Valgrid มีดังต่อไปนี้:

ตัวอย่างที่ 2:

เพื่อเริ่มต้นด้วยภาพประกอบนี้ ขั้นแรกเราจะสร้างไฟล์ 'test2' โดยใช้โปรแกรมแก้ไขข้อความ nano ตามที่อธิบายไว้ก่อนหน้านี้โดยการเขียนคำสั่ง:

$ นาโน ทดสอบ2

ตอนนี้เราเขียนโปรแกรม C++ เพื่อตรวจสอบว่ามีหน่วยความจำรั่วโดยใช้ Valgrind หรือไม่:

#รวม

#รวม

#รวม

const int a_s = 3000 ;

int หลัก ( ) {

ภายใน * ไอโอวา = มัลลอค ( ขนาดของ ( ภายใน ) * เช่น ) ;

สำหรับ ( อินท์ ไอ = 0 ; ฉัน < เช่น; ฉัน++ ) {

มัน [ ฉัน ] = ฉัน;

}

เส้นใย ( เวลา ( โมฆะ ) ) ;

int rn = แรนด์ ( ) % เช่น;

พิมพ์ฉ ( 'มัน[%d]: %d \n ' , rn, มัน [ ] ) ;

กลับ 0 ;

}

เรามาผ่านโปรแกรมกันเถอะ

โค้ดประกอบด้วยไฟล์ส่วนหัวที่จำเป็นและกำหนดตัวแปรคงที่ “a_s” ด้วยค่า 3000 ภายในฟังก์ชัน main() จะมีการประกาศตัวชี้ “ia” ประเภท int* และหน่วยความจำได้รับการจัดสรรแบบไดนามิกโดยใช้ “malloc” การทำงาน. นิพจน์ “sizeof(int) * a_s” กำหนดหน่วยความจำที่จำเป็นทั้งหมดเพื่อจัดเก็บจำนวนเต็ม “a_s” องค์ประกอบทั้งหมดของอาร์เรย์ 'ia' ได้รับการเตรียมใช้งานโดยลูป 'for' พร้อมค่าดัชนีที่สอดคล้องกัน ตัวอย่างเช่น ia[0] จะเป็น 0, ia[1] จะเป็น 1 และอื่นๆ

เครื่องกำเนิดตัวเลขสุ่มจะถูกเพาะโดยใช้ฟังก์ชัน “srand” โดยใช้เวลาปัจจุบัน สิ่งนี้ทำให้แน่ใจได้ว่าโปรแกรมจะสร้างชุดจำนวนเต็มสุ่มที่ไม่ซ้ำกันในแต่ละครั้งที่มีการดำเนินการ ฟังก์ชัน “rand” จะสร้างตัวเลขสุ่ม และกำหนด “rn” ด้วยผลลัพธ์ของ rand() % a_s ตัวดำเนินการโมดูลัส “%” จำกัดช่วงของตัวเลขสุ่มให้อยู่ระหว่าง 0 ถึง a_s – 1 ซึ่งสอดคล้องกับดัชนีที่ถูกต้องภายในอาร์เรย์ “ia”

ในที่สุด โปรแกรมจะใช้ฟังก์ชัน “printf” เพื่อพิมพ์ค่าที่ดัชนีที่เลือกแบบสุ่ม “rn” ของอาร์เรย์ “ia” พร้อมกับดัชนีที่เกี่ยวข้อง

เมื่อคุณรันโปรแกรมนี้ผ่าน Valgrind มันจะสร้างรายงานเอาต์พุตต่อไปนี้:

  ภาพหน้าจอของโปรแกรมคอมพิวเตอร์คำอธิบายที่สร้างขึ้นโดยอัตโนมัติ

บทสรุป

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