350 likes | 518 Views
עבודה ב- T2/Stud. מבוא לתכנות מערכות. מטרה. ברצוננו לכתוב את התכנית הבאה: התכנית מנהלת חשבונות בנק. התכנית מורצת משורת הפקודה ומקבלת כפרמטר קובץ לשימוש מאגר הנתונים. המשתמש מבצע פקודות על המאגר בעזרת מנשק טקסטואלי. בסיום ריצת התכנית מאגר הנתונים החדש נשמר בקובץ הפלט.
E N D
עבודה ב-T2/Stud מבוא לתכנות מערכות
מטרה • ברצוננו לכתוב את התכנית הבאה: • התכנית מנהלת חשבונות בנק. • התכנית מורצת משורת הפקודה ומקבלת כפרמטר קובץ לשימוש מאגר הנתונים. • המשתמש מבצע פקודות על המאגר בעזרת מנשק טקסטואלי. • בסיום ריצת התכנית מאגר הנתונים החדש נשמר בקובץ הפלט. • נרצה להריץ את התכנית על שרת ה-T2/Stud. מבוא לתכנות מערכות
דוגמה database.txt [Business Yaron Levi 6000.00] [Regular Dani Din 600.00] myuser@stud > bank database.txt database2.txt add Moshe Cohen Premium 50000.00 deposit Moshe Cohen Premium 4000.00 withdraw Dani Din Regular 300.00 exit myuser@stud > database2.txt [Business Yaron Levi 6000.00] [Regular Dani Din 300.00] [Premium Moshe Cohen 54000.00] מבוא לתכנות מערכות
תכן התכנית • תכנית גדולה נהוג לחלק למודולים. • כיצד יש לחלק תכנית נלמד במהלך הקורס. • בד"כ המודולים נוצרים לפי "עצמים" המופיעים בתוכנה. • התוכנה שלנו תורכב ממודול עבור חשבון בנק. • מודול זה ימומש בקבצים account.h ו-account.c. • את העיבוד של מאגר הנתונים ופקודות המשתמש נבצע בקובץ נוסף - main.c. מבוא לתכנות מערכות
מטרת השיעורים • בשיעורים אלו נתעסק בכלים הדרושים לשלבים השונים של כתיבת התכנית. • כתיבת הקוד • קומפילציה • ניפוי שגיאות - debugging • כיצד ניתן לכתוב את הקוד הדרוש לתכנית כזו יילמד בהרצאות ובתרגולים. • כיצד מחלקים את הקוד לקבצים • כיצד משתמשים במבני נתונים מתאימים • וכו'... • קוד התכנית הפתורה זמין באתר הקורס תחת Course Material מבוא לתכנות מערכות
עבודה מרחוק ב-T2/Stud • בשיעור זה נתרכז בכתיבת תכניות, בדיקתן והרצתן ישירות על שרת ה-Stud: • התחברות ל-Stud • עריכת טקסט • הידור תכניות • הרצת ובדיקת תכניות מבוא לתכנות מערכות
התחברות ל-Stud • כיצד ניתן להתחבר לשרת ה-Stud נלמד בפירוט בתרגול הראשון. • נשתמש ב-SSH כדי להתחבר בדוגמאות אלו ל-Stud. • SSH היא תכונת אמולציה לטרמינל מרחוק. • SSH ניתנת להורדה עבור Windows מהכתובת הבאה: ftp://ftp.cs.technion.ac.il/pub/ssh-client/sshclient.exe • עבור לינוקס (או OSX) ניתן פשוט לפתוח חלון טרמינל ולהשתמש בפקודה “ssh”. מבוא לתכנות מערכות
ניווט בסיסי • לאחר ההתחברות נגיע לתיקית הבית שלנו. • תיקיה תיקרא גם: ספריה מדריך, Folder או Directory. • בכל שלב ניתן לחזור אליה ע"י הפקודה cd ~. • ניתן לבצע פקודות ע"י הקלדת שמן: • עבור פקודות בסיסיות פשוט לרשום את שמן: • למשל cd, cp, mv, ls. • רשימת פקודות מפורטת יותר מופיעה בתרגול מס' 1. • עבור תכניות יש לכתוב את כתובת קובץ ההרצה: • ע"י כתובתו המלאה המתחילה מהתיקיה הראשית "/" • ע"י רישום כתובת יחסית. • כדי להריץ קובץ בתיקיה הנוכחית יש לרשום “./<filename>” מבוא לתכנות מערכות
יצירת תיקיה חדשה • בשלב הראשון ניצור תיקיה תחת תיקית הבית אשר בה נכתוב ונריץ את התכנית. • הפקודה mkdir יוצרת תיקיה חדשה. • הפקודה cd מחליפה את התיקיה הנוכחית. • שימו לב! ב-Unix (בניגוד ל-Windows) שמות הקבצים והתיקיות הם case-sensitive • הבדל זה יכול להשפיע על קוד שמתייחס לשמות קבצים כך שיעבוד שונה במערכות הפעלה שונות! Last login: Thu Aug 20 23:50:22 2009 from 93-173-128-49.techion.ac.il myuser@stud > mkdir Bank myuser@stud > cd Bank אדום = רע מבוא לתכנות מערכות
עריכת טקסט • כדי לכתוב את קוד התכנית עלינו להשתמש בתוכנה לעריכת טקסט. • קיימות מספר תוכנות פופולריות לעריכת טקסט בטרמינל: • pico • vim • emacs • נתרכז בשימוש ב-Emacs. מבוא לתכנות מערכות
Emacs • Emacs הוא עורך טקסט משוכלל במיוחד. • בבסיסו Emacs הוא מתרגם פקודות של שפת התכנות emacs-lisp. • מאפשר למשתמשים להוסיף תכונות לתכנית בקלות. • ניתן להפעיל את Emacs במנשק גרפי או בטרמינל. • כברירת מחדל Emacs מופעל במצב גרפי אם הוא זמין. • מומלץ להשתמש במנשק הגרפי בגלל זמינות התפריטים לעכבר שמקלה על מציאת פקודות ראשונית. • ניתן להוריד גרסה ל-Windows: מצב גרפי http://ftp.gnu.org/gnu/emacs/windows/emacs-22.3-bin-i386.zip myuser@stud > emacs <files> מצב טרמינל מבוא לתכנות מערכות
מושגים בסיסיים ב-Emacs • C-<key>- לחיצה על Ctrl+<key> משמש בהגדרת קיצורים. • M-<key>- לחיצה Meta+<key>. • לפעמים Alt מתפקד ככפתור זה, אם לא ניתן להחליף אותו בלחיצה על מקש Escולאחריה לחיצה על <key>. • buffer - חוצץ טקסט הניתן להצגה ו/או עריכה. למשל לכל קובץ פתוח קיים buffer מתאים. • minibuffer - חוצץ התחתית החלון אשר משמש את Emacs להודעות ושאלות. • למשל: • חלק מהשאלות נענות ע"י לחיצת מקש, חלקן דורשות לרשום מחרוזת ולחיצה על Enter (למשל פתיחת קובץ). Modified buffers exist; exit anyway? (yes or no) מבוא לתכנות מערכות
שליטה ב-Emacs • פתיחת חוצץ חדש (מקובץ): • מלבד החוצצים הנפתחים לכל קובץ שניתן כפרמטר לפקודת ההרצה ניתן לפתוח קובץ נוסף ע"י C-x C-f. • ניתן לפתוח גם תיקיה ע"י C-x d, בחוצץ תיקיה ניתן לבחור קובץ לפתיחה ע"י לחיצה על Enter. • מעבר בין חוצצים: • ע"י C-x b והכנסת שם החוצץ. (Tab ישלים אוטומטית במקרה זה וימיג את רשמית החוצצים האפשריים) • סגירת חוצץ: • ע"י C-x k. • שמירת קובץ: • בשמו הנוכחי ע"י C-x C-s • בשם חדש ע"י C-x C-w • יציאה: • יציאה מתבצעת ע"יC-x C-c, אם יש חוצצים לא שמורים תופיע שאילתה האם יש לשמור אותם. מבוא לתכנות מערכות
שליטה ב-Emacs • חיפוש - C-s: (או C-r לחיפוש לאחור) • מתחיל חיפוש אינקרמנטלי. • ברגע לחיצת תו למחרוזת החיפוש Emacs יקפוץ לתוצאה הראשונה המתאימה. • לחיצה נוספת על C-s תקפוץ לתוצאה הבאה. • ביטול פעולה אחרונה (Undo): • מתבצע ע"י C-x uאו C-_ • אין ב-Emacs פעולת redo כמו בתוכנות שכיחות. במקום זאת לאחר ביצוע מספר פעולות undo ופעולה שאינה undo כל הפעולות האחרונות ייכנסו למחסנית ה-undo (כלומר ניתן לבצע undo לפעולות ה-undo הקודמות) • השלמה אוטומטית: • ניתן להשתמש ב-Tab כדי להשלים שמות פקודות של Emacs ושמות קבצים. • ניתן להשלים מילים הקוד בעזרת M-/. • ההשלמה משלימה את המילה הנוכחית לפי המילה המתאימה האחרונה בקוד, לחיצות נוספות ישלימו את המילה באפשרות הבאה בתור. • שימוש בהשלמה יחסוך לכם הרבה זמן ושגיאות קומפילציה כתוצאה משגיאות כתיב. מבוא לתכנות מערכות
שליטה ב-Emacs • שליטה במספר חוצצים בו זמנית: • ניתן לפצל את חלון הטקסט הנוכחי כך שיציג מספר חוצצים בבת אחת. • C-x o מעביר את הסמן הפעיל לחלון הבא. • C-x 0 סוגר את החלון הפעיל. • C-x 1סוגר את כל החלונות מלבד החלון הפעיל. • C-x 2 לפיצול אנכי (שני קבצים אחד מעל השני) • C-x 3 לפיצול מאוזן (שני קבצים אחד ליד השני) • לכל פקודה יש שם מלא, זהו שם הפונקציהב-Emacs Lisp. • ניתן להריץ פקודה לפי שם ע"י M-x ורישום שם הפקודה. • לחיצה על Tab תשלים אוטומטית ותציג את רשימת האפשרויות. • החומר המפורט כאן לשימוש ב-Emacs הוא בסיסי במיוחד, ניתן לקרוא את המדריך הקצר והיעיל הבא: http://www2.lib.uchicago.edu/keith/tcl-course/emacs-tutorial.html מבוא לתכנות מערכות
עזרה ב-Emacs • ניתן למצוא פקודות Emacs גם ע"י שימוש במנגנון העזרה הפנימי. • כל פקודות העזרה מתחילות ב-C-h. • הפקודה C-h C-hתפתח חוצץ המציג את פקודות העזרה השונות. • C-h a: מחכה למחרוזת קלט ומדפיס את כל הפקודות המכילות מחרוזת זו בשמה. • למשל פקודות מחיקה יכילו את המחרוזת “delete” בשמן בד"כ. • C-h k: מחכה ללחיצה על מקש כלשהו ומדפיסה את הפקודה הקשורה למקש זה (אם קיימת אחת). • C-h t: מריצה את התרגול (Tutorial) הפנימי למשתמשים חדשים. מומלץ מאוד להריץ את פקודה זו בפעם הראשונה שעובדים עם Emacs. מבוא לתכנות מערכות
קובץ .emacs • Emacs קורא בצורה אוטומטית את הקובץ ~/.emacs בתחילת ההרצה וטוען ממנו הגדרות משתמש. • בסביבת Unix קבצים ששמם מתחיל בנקודה הם קבצים נסתרים אשר משמשים בד"כ לשמירת העדפות משתמש. • רוב התכניות ב-Unix משתמשות בשיטה זו. • באתר הקורס ניתן להוריד קובץ .emacs מועיל תחת Course Material, Helpers. • מוסיף צביעה של הקוד ב-C/C++ • קיצורים נוחים לקומפילציה ו"דיבוג" מתוך Emacs. • הגדרת מקשי המקלדת בצורה מתאימה יותר למשתמשי חלונות. • ניתן לערוך את הקובץ ולהתאים אותו לטעמכם. • ניתן ללמוד emacs-lisp בסיסית ב-http://www.gnu.org/software/emacs/emacs-lisp-intro/html_mono/emacs-lisp-intro.html. • ניתן להבין מהקובץ הקיים כיצד לבצע פעולות פשוטות. • למשל החלפת הצבעים תדרוש החלפה של מחרוזות פשוטות בקוד. • ניתן למצוא קוד להורדה ב-http://www.emacswiki.org/emacs/ElispArea#toc2. ירוק = טוב מבוא לתכנות מערכות
קומפילציה / הידור • בכדי להריץ את התכנית שכתבנו עלינו לקמפל אותה תחילה. • ברוב מערכות ה-Unix (וכולן במסגרת הקורס) מותקן קומפיילר C הקרוי GCC - GNU Compiler Collection. • הערה: נא לא להתבלבל בין קומפיילר לסביבת פיתוח. • סביבת פיתוח (כמו Dev C++ למשל) מכילה קומפיילר ואת שאר הכלים הדרושים לפיתוח תוכנה. • הקומפיילר עצמו הוא תכנית המורצת משורת פקודה עם קבצי קלט היוצרת קובץ פלט המכיל פקודות מכונה שניתן להריץ. מבוא לתכנות מערכות
GCC • כדי לקמפל את התכנית נריץ את הקומפיילר עם קבצי הקוד כפרמטרים: • אם הקוד תקין יתקבל קובץ בשם a.out אותו נוכל להריץ. myuser@stud > gccmain.caccount.c myuser@stud > a.out database.txt add Moshe Cohen Premium 50000.00 exit myuser@stud > מבוא לתכנות מערכות
שגיאות קומפילציה • אם הקוד אינו תקין GCC ידפיס למסך את רשימת שגיאות הקומפילציה שמנעו את המשך הקומפילציה. • לכל שגיאה מצוין מספר השורה בו נמצאה ותיאורה. myuser@stud > gccmain.caccount.c account.c: In function `AccountCreate': account.c:52: error: syntax error before "return" account.c: In function `AccountRead': account.c:74: error: `balance' undeclared (first use in this function) account.c:74: error: (Each undeclared identifier is reported only once account.c:74: error: for each function it appears in.) myuser@stud > מבוא לתכנות מערכות
פרמטרים של GCC • בקורס זה נקמפל את התכניות שלנו עם שורת הפקודה הבאה: • -o <filename>דגל זה מורה לקומפיילר לכתוב את קובץ הפלט לקובץ <filename> במקום לברירת המחדל a.out. • -std=c99 דגל זה קובע את סטנדרט השפה לפיו הקומפיילר יעבוד. הסטדרנט בקורס הוא C99. • שימו לב, ב-C99 ניתן להגדיר משתנים לא רק בתחילת בלוק, ואף בתחילת לולאת for: • -pedantic-errorsמכריח את הקומפיילר להקפיד על הסטנדרט הנבחר ולפלוט שגיאות על הפרות שלו. myuser@stud > gcc -o bank -std=c99 -pedantic-errors -Wall -Werrormain.caccount.c for (int i = 0; i < n; ++i) { printf("%d\n", i); } מבוא לתכנות מערכות
פרמטרים של GCC • בקורס זה נקמפל את התכניות שלנו עם שורת הפקודה הבאה: • -Wall גורם לקומפיילר להציג יותר אזהרות בזמן קומפילציה. • אזהרות קומפילציה דומות לשגיאות. • הקומפיילר יכול להתעלם מהן. • בד"כ הן מצביעות על טעויות של המתכנת או על קוד שנכתב בצורה לא טובה. • נעדיף לראות את אזהרות אלו ולחסוך לנו טעויות בהמשך. • -Werrorדגל זה מורה לקומפיילר להתייחס לאזהרה כאל שגיאה. • כלומר הקוד שלכם בקורס חייב להתקמפל גם ללא אזהרות. • בד"כ (ובקורס הזה תמיד) אין סיבה שהקוד שלכם יכיל אזהרות. myuser@stud > gcc -o bank -std=c99 -pedantic-errors -Wall -Werrormain.caccount.c מבוא לתכנות מערכות
השוואת טקסט • הפקודה diff משמשת להשוואת שני קבצי טקסט. • אם הקבצים זהים לא יודפס כלום. • אם הם שונים תודפס רשימת שינויים שיש לבצע על הקובץ הראשון כדי להפכו לשני myuser@stud > cat file1.txt [Business Yaron Levi 6000.00] [Regular Dani Din 600.00] myuser@stud > cat file2.txt [Premium Moshe Cohen 54000.00] [Business Yaron Levi 6000.00] [Regular Dani Din 300.00] myuser@stud > diff file1.txt file2.txt 0a1 > [Premium Moshe Cohen 54000.00] 2c3 < [Regular Dani Din 600.00] --- > [Regular Dani Din 300.00] • בדוגמה: • 0a1: בשורה 0 (לפני השורה הראשונה) יש להוסיף את שורה 1 (מהקובץ השני) • :2c3 את שורה 2 יש להחליף בשורה 3 מהקובץ השני. • אכן, הפלט אינו נוח לקריאה. מבוא לתכנות מערכות
sdiff • הפקודה sdiff דומה לפקודה diff מלבד צורת הפלט. • שני הקבצים יוצגו אחד ליד השני. • שורות ארוכות ייחתכו. • כל שורה מהקובץ הראשון תותאם ותוצג ליד שורה מהקובץ השני. • שורות שהותאמו לשורה ריקה או שורה שאינה זהה יוצגו עם תו | מפריד ביניהן כדי לסמן הבדלים ביון הקבצים. • sdiff מאפשרת צורה נוחה יותר להבנת ההבדלים בין קבצים כאשר הם אכן קיימים. shiroko2@stud > diff file1.txt file2.txt > [Premium Moshe Cohen 54000.00] [Business Yaron Levi 6000.00] [Business Yaron Levi 6000.00] [Regular Dani Din 600.00] | [Regular Dani Din 300.00] מבוא לתכנות מערכות
בדיקות • כדי לבדוק את התכנית שלנו: • נכתוב קבצי קלט וקובץ פלט צפוי. • נריץ את התכנית עם קבצי הקלט. • נשתמש ב-diff בכדי לבדוק אם הפלט שהתקבל מתאים לפלט הצפוי. • בעזרת שיטה זו נוכל לוודא את נכונות התכנית בצורה אוטומטית לאחר שינויים בקוד. • שיטה זו חוסכת הכנסת קלט ידנית לתכנית בשלב הבדיקה. מבוא לתכנות מערכות
דוגמא: database.txt [Business Yaron Levi 6000.00] [Regular Dani Din 600.00] • כדי לבדוק את התכנית נכתוב תרחישים קצרים הבודקים את התכנית • במקרה שלנו נצטרך: • קובץ נתונים התחלתי • קובץ קלט לפקודות • קובץ הפלט הצפוי • כדי לבדוק את התכנית נריץ את הפקודות הבאות: • אם לא מודפס כלום התכנית עובדת כמתוכנן. • אחרת ניתן לנתח את הפלט ולראות מהי ההתנהגות הלא נכונה. • אפשרות נוספת היא שהתכנית פשוט תתרסק ולא נגיע לפקודה השנייה. test.in add Moshe Cohen Premium 50000.00 deposit Moshe Cohen Premium 4000.00 withdraw Dani Din Regular 300.00 exit myuser@stud > ./bank database.txt out.txt < test.in myuser@stud > diff out.txt test1.out test1.out [Business Yaron Levi 6000.00] [Regular Dani Din 300.00] [Premium Moshe Cohen 54000.00] מבוא לתכנות מערכות
שימוש בתכונות ה-Shell • ה-Shell היא הסביבה הטקסטואלית בה מורצות הפקודות בשימוש בטרמינל. • בהתחברות ל-Stud מופעלת ה-Shell הקרויה C-Shell. • כל Shell מכילה קיצורים ע"מ להקל על המשתמש מהקלדה מייגעת של פקודות. • קיצורים בסיסיים המקלים על העבודה: • TAB: משלים את המילה הנוכחית לשם קובץ או פקודה. • ניתן להשתמש בחצים ↑/↓ כדי לעבור על הפקודות האחרונות שבוצעו. • קיצורים אלה עובדים בכל Shell פופולרי, בפרט: • ב-C-Shell (על ה-Stud) • ב-Bash (Shell ברירת המחדל ב-Linux Ubuntu) • ב-Command Prompt ב-Windows. מבוא לתכנות מערכות
הרצת script • ניתן גם לכתוב מספר פקודות בקובץ טקסט ולהריץ את פקודות אלו ע"י הפקודה source. • קבצים אלו נקראים תסריטים (scripts). • חומר זה נלמד לעומק בהמשך הקורס, בינתיים ניתן לעשות בו שימוש בסיסי אך חשוב. backup.csh echo “Backing up code…” mkdir backup cp *.c *.h backup echo “Done” myuser@stud > source backup.csh Backing up code… Done myuser@stud > • ע"י הוספת הרשאות ריצה לקובץ ניתן להריצו משורת הפקודה כמו תכנית: myuser@stud > chmodu+xbackup.csh myuser@stud > backup.csh Backing up code… Done myuser@stud > מבוא לתכנות מערכות
הרצת בדיקות אוטומטית • עכשיו כשאנו יודעים כיצד ניתן לבדוק בצורה אוטומטית את התכנית וכיצד ניתן לכתוב תסריטים נאחד את שיטות אלה כדי לאפשר בדיקה אוטומטית נוחה. • הקפידו על יצירת בדיקות ותסריט להרצתן כבר בתחילת העבודה • הריצו לאחר כל ביצוע שינוי בקוד • הרצה קבועה של הבדיקות תמנע בזבוז זמן בבדיקות ו"פאדיחות" ברגע האחרון. run_tests.csh gcc -o bank -std=c99 -pedantic-errors -Wall -Werrormain.caccount.c echo “Test no.1 (Adding accounts)” ./bank database.txt out.txt < test1.in diff out.txt test1.out echo “Test no.2 (Depositing)” ./bank database.txt out.txt < test2.in diff out.txt test2.out echo Test no.3 (Withdraw) ./bank database.txt out.txt < test3.in diff out.txt test3.out myuser@stud > source run_tests.csh Test no.1 (Adding accounts) Test no.2 (Depositing) Test no.3 (Withdraw) myuser@stud > מבוא לתכנות מערכות
שימוש ב-GDB • כלי אחרון וחשוב לעבודה במנשק טקסט הוא GDB. • GDB הוא דיבאגר בסיסי המגיע בד"כ עם GCC. • "דיבאגר" היא תכנית המאפשרת להריץ את התכנית שלנו בצורה מבוקרת ולבדוק את מצב התכנית. • איתור נקודות התרסקות • הדפסת ערכי משתנים • כאשר מקמפלים את התכנית לצרכי "דיבוג" חשוב להוסיף את הדגל -g. • מוסיף מיפוי לקוד המקור לקובץ ההרצה הבינארי ומאפשר לתכניות כגון GDB לספק מידע מדויק יותר. myuser@stud > gcc -o bank -g -std=c99 -pedantic-errors -Wall -Werrormain.caccount.c מבוא לתכנות מערכות
שימוש ב-GDB לטיפול בקריסות תוכנה #include<stdio.h> int twice(int* ptr) { int result = *ptr + *ptr; return result; } int main() { int a = 5; printf("%d\n",twice(&a)); int* ptr = NULL; printf("%d\n",twice(ptr)); return 0; } • קריאת הערך המוצבע ממצביע שערכו NULL תגרום לתכנית לעצור בפתאומיות. • בתכנית הנתונה הקריאה השנייה ל-f תגרום לקריאת הערך ממצביע NULL. • הרצה רגילה של התכנית ללא דיבאגר אינה מספקת מידע על הסיבה להתרסקות. myuser@stud > gcccrash.c myuser@stud > ./a.out 10 Segmentation fault myuser@stud > מבוא לתכנות מערכות
שימוש ב-GDB לטיפול בקריסות תוכנה • כדי להריץ את GDB נריץ את התכנית עם קובץ ההרצה אותו נרצה "לדבג". • GDB עובדת בעזרת מנשק טקסטואלי. כאשר התכנית הנבדקת אינה רצה תופיע שורת פקודה בה ניתן להכניס פקודות שונות של GDB, למשל: • run - מריצה את התכנית • continue - ממשיכה את ריצת התכנית לאחר הפסקה • step מריץ שורת קוד אחת בדיוק (נכנס לפונקציה) • print - מקבל שם משתנה או ביטוי כפרמטר ומדפיס את ערכו • ניתן לעצור זמנית את ריצת התכנית ע"י Ctrl+z. • ניתן להפסיק את ריצת התכנית לחלוטין ע"י Ctrl+C. myuser@stud > gdb <binary file> מבוא לתכנות מערכות
שימוש ב-GDB לטיפול בקריסות תוכנה • עכשיו נריץ את התכנית שוב מתוך GDB. • הדגל -q חוסך הדפסה של הודעת הפתיחה. • הפקודה run יכולה לקבל פרמטרים להרצת התכנית • כאשר התכנית מנסה לקרוא כאת את המצביע ההרצה נעצרת ו-GDB מספק מידע מדויק לגבי מיקום התכנית. • ע"י הפקודה backtrace ניתן להדפיס את מצב מחסנית הקריאות. • במקרה שלנו הפונקציה twice נקראת מ-main. myuser@stud > gcc -g crash.c myuser@stud> gdb -q a.out (gdb) run Using host libthread_db library "/lib64/tls/libthread_db.so.1". Starting program: /u1/115/myuser/a.out 10 Program received signal SIGSEGV, Segmentation fault. 0x00000000004004b4 in twice (ptr=0x0) at crash.c:4 4 int result = *ptr + *ptr; (gdb) backtrace #0 0x00000000004004b4 in twice (ptr=0x0) at crash.c:4 #1 0x00000000004004fa in main () at crash.c:12 (gdb) מבוא לתכנות מערכות
עצירת התכנית בנקודה ספציפית shiroko2@stud > gdb -q a.out Using host libthread_db library "/lib64/tls/libthread_db.so.1". (gdb) break twice Breakpoint 1 at 0x4004b0: file crash.c, line 4. (gdb) run Starting program: /u1/115/shiroko2/a.out Breakpoint 1, twice (ptr=0x7fbffff7dc) at crash.c:4 4 int result = *ptr + *ptr; (gdb) print ptr $1 = (int *) 0x7fbffff7dc (gdb) print *ptr $2 = 5 (gdb) print *ptr+*ptr $3 = 10 (gdb) continue Continuing. 10 Breakpoint 1, twice (ptr=0x0) at crash.c:4 4 int result = *ptr + *ptr; • חלק גדול מהבאגים הם שגיאות התנהגותיות של התכנית. • כדי לבדוק אותן נרצה לעצור את התכנית, לבדוק את ערכי המשתנים ולהתקדם צעד צעד. • כדי לעצור את התכנית בשורת קוד מסוימת נוסיף נקודת עצירה (breakpoint) ע"י הפקודה break ושם הפונקציה שיש לעצור בתחילתה • נוכל לבדוק את ערכי המשתנים בעזרת הפקודה print. • כדי להמשיך בריצת התכנית נשתמש ב-continue (המשך עד נקודת העצירה הבאה) • כדי להתקדם בצורה מבוקרת נשתמש בפקודה step. מבוא לתכנות מערכות
GDB - סיכום • העבודה עם GDB אינה פשוטה בהתחלה. • אבל עדיין עדיפה על עבודה ללא דיבאגר. • התחילו בשימוש בפקודות הפשוטות שמוצגות כאן. • ניתן לקבל את רשימת הפקודות המלאה ע"י הפקודה help ולקבל מידע מפורט יותר. • בהמשך נלמד שימוש נוסף ב"דיבאגרים" נוחים יותר. • בפרט נראה מנשקים גרפיים אשר עובדים מעל GDB ומאפשרים עבודה נוחה יותר. מבוא לתכנות מערכות