כיצד לזהות דליפות זיכרון ב-C/C++ עם Valgrind

Kyzd Lzhwt Dlypwt Zykrwn B C C M Valgrind



Valgrind הוא כלי בשימוש נרחב לניפוי באגים ופרופיל של תוכנות שכתובות בעיקר בשפות C, C++ ושפות אחרות. זה עוזר למפתחים לזהות דליפות זיכרון, לאתר את שגיאות הגישה לזיכרון ולעשות פרופיל של ביצוע התוכניות שלהם.

כאשר אתה מפעיל תוכנית תחת Valgrind, היא מכשירה באופן דינמי את קובץ ההפעלה של התוכנית, ומאפשרת לה לנטר את השימוש בזיכרון והתנהגות הביצוע של התוכנית.

דליפות זיכרון ב-C++

חשוב לציין כי Valgrind מיועד בעיקר עבור תוכניות C ו-C++ וייתכן שלא יפעל באותה יעילות עם שפות אחרות או בכל התרחישים. בנוסף, הפעלת תוכנית תחת Valgrind יכולה להאט משמעותית את ביצועה, ולכן היא משמשת לעתים קרובות במהלך פיתוח ואיתור באגים ולא בסביבות ייצור.







כאשר זיכרון שנוצר באופן דינמי אינו משוחרר כראוי, הוא עלול לגרום לדליפות זיכרון ב-C/C++ אשר ירוקן לאט את משאבי הזיכרון הזמינים. הדבר עלול לגרום לצריכת זיכרון מוגזמת ולירידה בביצועים של התוכנית.



התקנת Valgrid

כדי להתקין את Valgrind על מערכת לינוקס, פתח מסוף ועדכן את מאגרי החבילות שלך באמצעות מנהל החבילות הספציפי להפצת הלינוקס שלך. הפקודה הבאה פועלת עבור מערכות מבוססות אובונטו ודביאן:



$ סודו עדכון מתאים

השתמש במנהל החבילות כדי להתקין את Valgrind. שוב, הפקודה עשויה להשתנות בהתאם להפצת לינוקס שלך. השתמש בפקודה הבאה עבור מערכות מבוססות אובונטו ודביאן:





$ סודו מַתְאִים להתקין שער בחירות

כאשר תתבקש, הזן את סיסמת המשתמש שלך ולחץ על 'Enter'. שים לב שחשבון המשתמש שלך זקוק להרשאות ניהול כדי להתקין את התוכנה. מנהל החבילות מוריד ומתקין את Valgrind יחד עם כל התלות הנדרשת. התהליך עשוי להימשך מספר דקות.



לאחר סיום תהליך ההתקנה, תוכל לאשר את ההתקנה המוצלחת של Valgrind על ידי ביצוע הפקודה הבאה כשלב אימות:

$ שער בחירות --גִרְסָה

פקודה זו מציגה את פרטי הגרסה של Valgrind אם היא מותקנת בהצלחה.

זהו זה! כעת יש להתקין את Valgrind במערכת הלינוקס שלך, ואתה יכול להשתמש בו כדי לנתח ולאפות באגים בתוכניות C/C++ שלך עבור דליפות זיכרון ובעיות אחרות.

יצירת קובץ באובונטו

כדי להתחיל לעבוד על התוכנית, ראשית עלינו ליצור קובץ באובונטו. ליצירת קבצים, אנו משתמשים בעורך הטקסט הננו. אז, אנו כותבים את הפקודה בטרמינל באופן הבא:

$ ננו קובץ 1

כאן, ננו הוא השם של עורך הטקסט שמתבצע. הארגומנט 'file1' מייצג את שם הקובץ שאתה מתכוון לפתוח או ליצור באמצעות עורך הטקסט הננו. ננו פותחת את הקובץ לעריכה אם הוא כבר קיים; אם לא, הוא יוצר קובץ חדש עם השם שצוין. מכיוון שאין לנו קובץ כזה, הוא יוצר מסמך חדש בשם 'קובץ1'.

לאחר שתפעיל את הפקודה, עורך הננו ייפתח ויספק לך קנבס ריק כדי להזין או לערוך את התוכן של הקובץ 'file1'. אתה יכול להתחיל להקליד או להדביק את התוכן הקיים בעורך.

כעת, לאחר שהושגו כל התנאים המוקדמים, אנו יוצרים כמה דוגמאות לשימוש ב-Valgrind כדי לזהות את דליפות הזיכרון בתוכנות C++.

דוגמה 1:

הדוגמה הראשונה שאנו מספקים מדגימה דוגמה פשוטה של ​​הקצאת זיכרון דינמית באמצעות הפונקציה 'malloc' מספריית ב-C.

#include

int רָאשִׁי ( )

{

לְהַשְׁחִיר * א = malloc ( 102 ) ;

לַחֲזוֹר 0 ;

}

להלן פירוט של הקוד:

אנו כוללים תחילה את קובץ הכותרת הסטנדרטי של הספרייה המספק את הפונקציות כמו malloc להקצאת זיכרון דינמית והקצאה.

השורה main() int מכריזה על הפונקציה הראשית. לאחר מכן, ה-char *a = malloc(102); מכריז על משתנה מצביע 'a' מסוג char* (מצביע ל-char). הוא משתמש בפונקציית 'malloc' כדי להקצות באופן דינמי את הזיכרון עבור מערך של 102 רכיבי תווים (102 בתים בסך הכל). גודל הקצאת הזיכרון, מבוטא בבתים, נשלח כקלט לפונקציית malloc והוא מוציא מצביע לבלוק הזיכרון החדש שנוצר. למצביע ה-char* 'a' מוקצה ערך מצביע זה. לבסוף, 'החזר 0;' מסמל את סוף הפונקציה הראשית.

בקיצור, קוד זה מקצה באופן דינמי את הזיכרון עבור מערך של 102 רכיבי תווים באמצעות 'malloc' ומקצה את כתובת הזיכרון למצביע 'a'. עם זאת, שימו לב שהקוד אינו משתמש או מתפעל את הזיכרון המוקצה בשום צורה ואינו כולל ביטול הקצאה של הזיכרון באמצעות חינמי.

כאשר אנו מריצים תוכנית זו דרך Valgrind עם האפשרות '–leak-check=full', היא מבצעת בדיקת דליפת זיכרון ומספקת דוח פלט.

דוח הפלט שמופק על ידי Valgrid ניתן כדלקמן:

דוגמה 2:

כדי להתחיל באיור זה, אנו יוצרים תחילה קובץ 'test2' באמצעות עורך הטקסט הננו כפי שהוסבר קודם לכן על ידי כתיבת הפקודה:

$ ננו מבחן 2

כעת, אנו כותבים תוכנית C++ כדי לבדוק אם יש דליפת זיכרון כלשהי באמצעות Valgrind:

#include

#include

#include

const int a_s = 3000 ;

int main ( ) {

int * ia = malloc ( מידה של ( int ) * כפי ש ) ;

ל ( int i = 0 ; אני < כפי ש; i++ ) {

זה [ אני ] = i;

}

srand ( זְמַן ( ריק ) ) ;

int rn = רנד ( ) % כפי ש;

printf ( 'זה[%d]: %d \n ' , rn, זה [ 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 מסופק בתחילה. לאחר מכן, הרחבנו על יצירת קובץ באובונטו באמצעות עורך הטקסט הננו. בסופו של דבר, תוך שימוש בתנאים המוקדמים הללו, ביצענו שתי דוגמאות C++ כדי לבדוק את דליפות הזיכרון בהן. מצורף גם הדוח שנוצר על ידי Valgrind המציג את דליפות הזיכרון בקובץ שסופק.