เมื่อคุณรันโปรแกรมภายใต้ 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” จากไลบรารี
ภายใน หลัก ( )
{
ถ่าน * ก = มอลลอค ( 102 ) ;
กลับ 0 ;
}
นี่คือรายละเอียดของรหัส:
ขั้นแรกเราจะรวมไฟล์ส่วนหัวไลบรารีมาตรฐาน
บรรทัด 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 ซึ่งแสดงหน่วยความจำรั่วในไฟล์ที่ให้มาด้วย