שפר את איכות הקוד ומנע תוצאות בלתי צפויות על ידי לימוד כיצד להשתמש ב-GNU Debugger כדי לחשוף באגים לא רצויים בקוד שלך.

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

מאתר הבאגים של GNU או, GDB, הוא כלי ניפוי באגים נצחי שמתכנתים מסתמכים עליו כבר שנים. הנה איך להשתמש ב-GDB בלינוקס.

הכנת תוכניות לדוגמה

כדי לחקור את התכונות של GDB תזדקק לקובץ הפעלה להתנסות איתו. לשם הדגמה, תפעיל את GDB בתוכנית בדיקת מפתחות פעם אחת עם קוד מקור וסמלי ניפוי באגים זמינים, פעם אחת ללא קוד מקור, ובתוכנה פשוטה עם ריבוי הליכי שידפיסה הודעות למסך, שנכתבו ב-C והן הידור עם GCC (GNU C מַהְדֵר).

אתה יכול השתמש בכל מהדר C אחר אבל הקפד לא להפשיט את הבינארי.

סביר להניח שתפעיל GDB בתוכניות משלך. אז הקפד להרכיב אותם עם ה דגל עם gcc כדי לאפשר סמלים של ניפוי באגים.

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

instagram viewer

הפעלת תוכנית ב-GDB

אתה מפעיל תוכנית ב- GDB בכמה דרכים. או הקלידו gdb , ולאחר שהוא נטען, הקלד לָרוּץ. או הפעל את gdb ולאחר מכן השתמש ב- קוֹבֶץ הפקודה, טען את הקובץ הבינארי לתוך gdb, ולאחר מכן הפעל אותו עם ה- לָרוּץ פקודה.

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

gdb 
run

אוֹ:

gdb
file
run

הגדרת נקודות שבירה עם GDB

נקודות שבירה באיתור באגים מוגדרות ידנית עצירות קשות בקוד שעוצרות את זרימת הביצוע כאשר התוכנית מגיעה לנקודת שבירה. הגדרת נקודות עצירה מאפשרת לך לעבור דרך הקוד ולבדוק כיצד כל שלב של ביצוע משפיע על נתונים ומשתנים.

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

break main
break 47

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

info breakpoints

כדי למחוק נקודת עצירה מסוימת או נקודות עצירה מרובות, הקלד:

delete 2
delete 3-5

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

break  if n == 2

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

continue

מעבר בקוד

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

זה גם עוזר לך לזהות את שורש התרסקות וללמוד את התנהגות התוכנית בדיוק כירורגי מכיוון שאתה יכול לעבור דרך כל שורת קוד כרצונך. אתה יכול לעבור בקוד בשלוש דרכים עיקריות ב-GDB:

  1. שלב: פקודה זו אומרת ל- GDB להיכנס לשורה הבאה של קובץ המקור. זה מאפשר לך למעשה לחצות את אורך קוד המקור שורה אחר שורה.
  2. הַבָּא: פקודה זו מבצעת את השורה הבאה של קוד המקור בתוך הפונקציה הנוכחית ולאחר מכן מפסיקה. הַבָּא מתייחס לפונקציה כשורה בודדת, כך שאם אתה משתמש ב-Next לפני קריאת פונקציה, הוא יתייחס אליה כשורה בודדת ויעבור מעליה, בניגוד ל- שלב פקודה.
  3. סיים: פקודת הסיום מבצעת את כל השורות הנותרות בתוך הפונקציה הנוכחית ולאחר מכן מפסיקה.

בחינת משתנים

כשאתה עובר בקוד, תרצה לבחון את ערכם של משתנים כדי לראות כיצד הלוגיקה של התוכנית משנה אותם. להלן התחביר להצגת הערך של משתנים ב-GDB:

print 

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

display 

הגדרת תצפיות

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

watch 

איתור באגים ספציפי לשרשור עם GDB

GDB מאפשר לך לבצע איתור באגים ספציפי לשרשור בעת עבודה עם תוכניות ריבוי הליכי. לצורך הדגמה, נעבוד עם תוכנית C פשוטה המשתמשת בארבעה שרשורים כדי להדפיס הודעות עם כל שרשור.

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

info threads

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

thread 2

לאחר בחירת השרשור תוכל לעבור דרך זרימת הביצוע שלו באמצעות ה- שלב, הַבָּא, ו סיים פקודות כפי שהוצג לעיל.

איתור באגים מרחוק עם GDB

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

לדוגמה, כדי להתקין gdbserver במערכות מבוססות אובונטו או דביאן, השתמש ב-APT:

sudo apt install gdbserver

לאחר ההתקנה, עבור לתיקיה של הבינארי והפעל את הפקודה הזו כדי להפעיל את gdbserver:

gdbserver :

gdbserver צריך להחזיר את הפלט שהוא פועל ומאזין ביציאה שהגדרת. כעת במחשב הלקוח, הפעל את GDB ולאחר מכן התחבר לשרת המרוחק באמצעות יַעַד פקודה:

target remote :

כתיבת סקריפטים של GDB לאוטומציה של איתור באגים

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

הנה דוגמה:

set logging enabled on
set logging file sample.out
break main
command 1
backtrace
print N
continue
end
quit

בסקריפט שלמעלה, אתה אומר ל-GDB לאפשר רישום ולשמור את היומן בקובץ שנקרא sample.out, ואז הגדר נקודת שבירה ב- רָאשִׁי פוּנקצִיָה.

עבור נקודת עצירה מספר 1, במקרה זה, נקודת הניתוק בפונקציה main, הפעל את הפקודות הבאות: עקבות לאחור, הדפס, לְהַמשִׁיך. בעיקרון, GDB תריץ תחילה מעקב לאחור, לאחר מכן ידפיס את הערך של המשתנה "N", ימשיך בביצוע, ולבסוף יפסיק.

כדי להפעיל את הסקריפט הזה, השתמש ב:

gdb -x