35
תתתת תתתתתת תתתתתת

עבודה ב- T2/Stud

  • Upload
    tannar

  • View
    60

  • Download
    0

Embed Size (px)

DESCRIPTION

עבודה ב- T2/Stud. מבוא לתכנות מערכות. מטרה. ברצוננו לכתוב את התכנית הבאה: התכנית מנהלת חשבונות בנק. התכנית מורצת משורת הפקודה ומקבלת כפרמטר קובץ לשימוש מאגר הנתונים. המשתמש מבצע פקודות על המאגר בעזרת מנשק טקסטואלי. בסיום ריצת התכנית מאגר הנתונים החדש נשמר בקובץ הפלט. - PowerPoint PPT Presentation

Citation preview

Page 1: עבודה ב- T2/Stud

מבוא לתכנות מערכות

Page 2: עבודה ב- T2/Stud

ברצוננו לכתוב את התכנית הבאה:•התכנית מנהלת חשבונות בנק.–התכנית מורצת משורת הפקודה ומקבלת כפרמטר –

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

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

בקובץ הפלט..T2/Studנרצה להריץ את התכנית על שרת ה-–

2מבוא לתכנות מערכות

Page 3: עבודה ב- T2/Stud

myuser@stud > bank database.txt database2.txtadd Moshe Cohen Premium 50000.00deposit Moshe Cohen Premium 4000.00withdraw Dani Din Regular 300.00exitmyuser@stud >

myuser@stud > bank database.txt database2.txtadd Moshe Cohen Premium 50000.00deposit Moshe Cohen Premium 4000.00withdraw Dani Din Regular 300.00exitmyuser@stud >

database.txt

[Business Yaron Levi

6000.00]

[Regular Dani Din 600.00]

database2.txt

[Business Yaron Levi 6000.00]

[Regular Dani Din 300.00]

[Premium Moshe Cohen 54000.00]

3מבוא לתכנות מערכות

Page 4: עבודה ב- T2/Stud

תכנית גדולה נהוג לחלק למודולים.•כיצד יש לחלק תכנית נלמד במהלך הקורס.–בד"כ המודולים נוצרים לפי "עצמים" המופיעים –

בתוכנה.

התוכנה שלנו תורכב ממודול עבור חשבון בנק.•.account.c ו-account.hמודול זה ימומש בקבצים –את העיבוד של מאגר הנתונים ופקודות המשתמש –

.main.cנבצע בקובץ נוסף -

4מבוא לתכנות מערכות

Page 5: עבודה ב- T2/Stud

בשיעורים אלו נתעסק בכלים הדרושים לשלבים השונים של כתיבת •התכנית.

כתיבת הקוד–קומפילציה–debuggingניפוי שגיאות - –

כיצד ניתן לכתוב את הקוד הדרוש לתכנית כזו יילמד בהרצאות •ובתרגולים.

כיצד מחלקים את הקוד לקבצים–כיצד משתמשים במבני נתונים מתאימים–וכו'...–

Course Materialקוד התכנית הפתורה זמין באתר הקורס תחת •

5מבוא לתכנות מערכות

Page 6: עבודה ב- T2/Stud

בשיעור זה נתרכז בכתיבת תכניות, בדיקתן •:Studוהרצתן ישירות על שרת ה-

Studהתחברות ל-–

עריכת טקסט–

הידור תכניות–

הרצת ובדיקת תכניות–

6מבוא לתכנות מערכות

Page 7: עבודה ב- T2/Stud

נלמד בפירוט Studכיצד ניתן להתחבר לשרת ה-•בתרגול הראשון.

.Stud כדי להתחבר בדוגמאות אלו ל-SSHנשתמש ב-•–SSH.היא תכונת אמולציה לטרמינל מרחוק

–SSH ניתנת להורדה עבור Windows:מהכתובת הבאה ftp://ftp.cs.technion.ac.il/pub/ssh-client/sshclient.exe

( ניתן פשוט לפתוח חלון טרמינל OSXעבור לינוקס )או –.”ssh“ולהשתמש בפקודה

7מבוא לתכנות מערכות

Page 8: עבודה ב- T2/Stud

לאחר ההתחברות נגיע לתיקית הבית שלנו.•.Directory או Folderתיקיה תיקרא גם: ספריה מדריך, –. ~cdבכל שלב ניתן לחזור אליה ע"י הפקודה –

ניתן לבצע פקודות ע"י הקלדת שמן:•עבור פקודות בסיסיות פשוט לרשום את שמן:–

.cd, cp, mv, lsלמשל •.1רשימת פקודות מפורטת יותר מופיעה בתרגול מס' •

עבור תכניות יש לכתוב את כתובת קובץ ההרצה:–ע"י כתובתו המלאה המתחילה מהתיקיה הראשית "/"•ע"י רישום כתובת יחסית.•

<”filename“./<כדי להריץ קובץ בתיקיה הנוכחית יש לרשום –

8מבוא לתכנות מערכות

Page 9: עבודה ב- T2/Stud

בשלב הראשון ניצור תיקיה תחת תיקית הבית •אשר בה נכתוב ונריץ את התכנית.

יוצרת תיקיה חדשה.mkdirהפקודה – מחליפה את התיקיה הנוכחית.cdהפקודה –( שמות הקבצים Windows )בניגוד ל-Unixשימו לב! ב-–

case-sensitiveוהתיקיות הם הבדל זה יכול להשפיע על קוד שמתייחס לשמות קבצים כך •

!יעבוד שונה במערכות הפעלה שונותש

Last login: Thu Aug 20 23:50:22 2009 from 93-173-128-49.techion.ac.ilmyuser@stud > mkdir Bankmyuser@stud > cd Bank

Last login: Thu Aug 20 23:50:22 2009 from 93-173-128-49.techion.ac.ilmyuser@stud > mkdir Bankmyuser@stud > cd Bank

אדום = רע

אדום = רע

9מבוא לתכנות מערכות

Page 10: עבודה ב- T2/Stud

כדי לכתוב את קוד התכנית עלינו להשתמש •בתוכנה לעריכת טקסט.

קיימות מספר תוכנות פופולריות לעריכת •טקסט בטרמינל:

–pico–vim–emacs

.Emacsנתרכז בשימוש ב-•

10מבוא לתכנות מערכות

Page 11: עבודה ב- T2/Stud

•Emacs הוא עורך טקסט משוכלל במיוחד.

הוא מתרגם פקודות של Emacsבבסיסו –.emacs-lispשפת התכנות

מאפשר למשתמשים להוסיף תכונות לתכנית •בקלות.

במנשק גרפי או Emacsניתן להפעיל את –בטרמינל.

מופעל במצב גרפי Emacsכברירת מחדל •אם הוא זמין.

מומלץ להשתמש במנשק הגרפי בגלל זמינות •התפריטים לעכבר שמקלה על מציאת

פקודות ראשונית.

:Windowsניתן להוריד גרסה ל-•

מצב גרפי

מצב טרמינלmyuser@stud > emacs >files>myuser@stud > emacs >files>

http://ftp.gnu.org/gnu/emacs/windows/emacs-22.3-bin-i386.zip

11מבוא לתכנות מערכות

Page 12: עבודה ב- T2/Stud

•C-<key< לחיצה על -Ctrl+>key>.משמש בהגדרת קיצורים

•M-<key< לחיצה -Meta+>key>. מתפקד ככפתור זה, אם לא ניתן להחליף אותו בלחיצה על Altלפעמים –

.<key< לחיצה על ולאחריה Escמקש

•buffer חוצץ טקסט הניתן להצגה ו/או עריכה. למשל לכל קובץ - מתאים.bufferפתוח קיים

•minibuffer חוצץ התחתית החלון אשר משמש את - Emacs להודעות ושאלות.

למשל:–חלק מהשאלות נענות ע"י לחיצת מקש, חלקן דורשות לרשום מחרוזת –

)למשל פתיחת קובץ(.Enterולחיצה על

Modified buffers exist; exit anyway? )yes or no(Modified buffers exist; exit anyway? )yes or no(

12מבוא לתכנות מערכות

Page 13: עבודה ב- T2/Stud

סגירת חוצץ:•.C-x kע"י –

שמירת קובץ:•-C-x Cבשמו הנוכחי ע"י –

sC-x C-wבשם חדש ע"י –

יציאה:•יציאה מתבצעת ע"י–

C-x C-c אם יש חוצצים ,לא שמורים תופיע

שאילתה האם יש לשמור אותם.

פתיחת חוצץ חדש )מקובץ(:•מלבד החוצצים הנפתחים לכל –

קובץ שניתן כפרמטר לפקודת ההרצה ניתן לפתוח קובץ נוסף

.C-x C-fע"י C-xניתן לפתוח גם תיקיה ע"י –

d בחוצץ תיקיה ניתן לבחור ,קובץ לפתיחה ע"י לחיצה על

Enter.

מעבר בין חוצצים:• והכנסת שם החוצץ. C-x bע"י –

(Tab ישלים אוטומטית במקרה זה וימיג את רשמית החוצצים

האפשריים(

13מבוא לתכנות מערכות

Page 14: עבודה ב- T2/Stud

לחיפוש לאחור(C-r: )או C-sחיפוש - •מתחיל חיפוש אינקרמנטלי.– יקפוץ לתוצאה הראשונה המתאימה.Emacsברגע לחיצת תו למחרוזת החיפוש – תקפוץ לתוצאה הבאה.C-sלחיצה נוספת על –

(:Undoביטול פעולה אחרונה )•-_Cאו C-x uמתבצע ע"י – כמו בתוכנות שכיחות. במקום זאת לאחר ביצוע redo פעולת Emacsאין ב-–

כל הפעולות האחרונות ייכנסו undo ופעולה שאינה undoמספר פעולות הקודמות(undo לפעולות ה-undo )כלומר ניתן לבצע undoלמחסנית ה-

השלמה אוטומטית:• ושמות קבצים.Emacs כדי להשלים שמות פקודות של Tabניתן להשתמש ב-–.-/Mניתן להשלים מילים הקוד בעזרת –

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

שימוש בהשלמה יחסוך לכם הרבה זמן ושגיאות קומפילציה כתוצאה משגיאות כתיב.•

14מבוא לתכנות מערכות

Page 15: עבודה ב- T2/Stud

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

http://www2.lib.uchicago.edu/keith/tcl-course/emacs-tutorial.html

שליטה במספר חוצצים בו זמנית:•ניתן לפצל את חלון הטקסט הנוכחי כך שיציג –

מספר חוצצים בבת אחת.–C-x o.מעביר את הסמן הפעיל לחלון הבא –C-x 0.סוגר את החלון הפעיל –C-x 1 .סוגר את כל החלונות מלבד החלון הפעיל–C-x 2)לפיצול אנכי )שני קבצים אחד מעל השני –C-x 3)לפיצול מאוזן )שני קבצים אחד ליד השני

לכל פקודה יש שם מלא, זהו שם הפונקציה•.Emacs Lispב-

ורישום M-xניתן להריץ פקודה לפי שם ע"י •.שם הפקודה

תשלים אוטומטית ותציג את Tabלחיצה על – רשימת האפשרויות.

15מבוא לתכנות מערכות

Page 16: עבודה ב- T2/Stud

גם ע"י שימוש במנגנון העזרה הפנימי.Emacsניתן למצוא פקודות •

.C-hכל פקודות העזרה מתחילות ב-•

תפתח חוצץ המציג את פקודות העזרה השונות. C-h C-hהפקודה •

•C-h a : מחכה למחרוזת קלט ומדפיס את כל הפקודות המכילות מחרוזת זובשמה.

בשמן בד"כ.”delete“למשל פקודות מחיקה יכילו את המחרוזת –

•C-h k : מחכה ללחיצה על מקש כלשהו ומדפיסה את הפקודה הקשורהלמקש זה )אם קיימת אחת(.

•C-h t : מריצה את התרגול(Tutorial) הפנימי למשתמשים חדשים. מומלץ .Emacsמאוד להריץ את פקודה זו בפעם הראשונה שעובדים עם

16מבוא לתכנות מערכות

Page 17: עבודה ב- T2/Stud

•Emacs קורא בצורה אוטומטית את הקובץ ./~emacs בתחילת ההרצה וטוען ממנו הגדרות משתמש.

קבצים ששמם מתחיל בנקודה הם קבצים נסתרים אשר משמשים בד"כ Unixבסביבת –לשמירת העדפות משתמש.

משתמשות בשיטה זו.Unixרוב התכניות ב-–

.Course Material, Helpers מועיל תחת emacs.באתר הקורס ניתן להוריד קובץ •++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ניתן למצוא קוד להורדה ב-–

ירוק = טוב

ירוק = טוב

17מבוא לתכנות מערכות

Page 18: עבודה ב- T2/Stud

בכדי להריץ את התכנית שכתבנו עלינו לקמפל אותה •תחילה.

)וכולן במסגרת הקורס( מותקן Unixברוב מערכות ה-•.GCC - GNU Compiler Collection הקרוי Cקומפיילר

הערה: נא לא להתבלבל בין קומפיילר לסביבת פיתוח.• למשל( מכילה קומפיילר ואת ++Dev Cסביבת פיתוח )כמו –

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

קלט היוצרת קובץ פלט המכיל פקודות מכונה שניתן להריץ.

18מבוא לתכנות מערכות

Page 19: עבודה ב- T2/Stud

כדי לקמפל את התכנית נריץ את הקומפיילר •עם קבצי הקוד כפרמטרים:

אותו נוכל a.outאם הקוד תקין יתקבל קובץ בשם –להריץ.

myuser@stud > gcc main.c account.cmyuser@stud > gcc main.c account.c

myuser@stud > a.out database.txtadd Moshe Cohen Premium 50000.00exitmyuser@stud >

myuser@stud > a.out database.txtadd Moshe Cohen Premium 50000.00exitmyuser@stud >

19מבוא לתכנות מערכות

Page 20: עבודה ב- T2/Stud

ידפיס למסך את GCCאם הקוד אינו תקין •רשימת שגיאות הקומפילציה שמנעו את המשך

הקומפילציה.

לכל שגיאה מצוין מספר השורה בו נמצאה ותיאורה.–

myuser@stud > gcc main.c account.caccount.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 onceaccount.c:74: error: for each function it appears in.(myuser@stud >

myuser@stud > gcc main.c account.caccount.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 onceaccount.c:74: error: for each function it appears in.(myuser@stud >

20מבוא לתכנות מערכות

Page 21: עבודה ב- T2/Stud

בקורס זה נקמפל את התכניות שלנו עם שורת הפקודה הבאה:•

•- o <filename< דגל זה מורה לקומפיילר לכתוב את קובץ הפלט.a.out במקום לברירת המחדל <filename<לקובץ

•-std=c99 .דגל זה קובע את סטנדרט השפה לפיו הקומפיילר יעבוד .C99הסטדרנט בקורס הוא

ניתן להגדיר משתנים לא רק בתחילת בלוק, ואף בתחילת C99שימו לב, ב-–:forלולאת

•-pedantic-errors מכריח את הקומפיילר להקפיד על הסטנדרטהנבחר ולפלוט שגיאות על הפרות שלו.

myuser@stud > gcc -o bank -std=c99 -pedantic-errors -Wall -Werror main.c account.cmyuser@stud > gcc -o bank -std=c99 -pedantic-errors -Wall -Werror main.c account.c

for (int i = 0; i < n; ++i) {printf("%d\n", i);

}

for (int i = 0; i < n; ++i) {printf("%d\n", i);

}

21מבוא לתכנות מערכות

Page 22: עבודה ב- T2/Stud

בקורס זה נקמפל את התכניות שלנו עם שורת הפקודה הבאה:•

•-Wall.גורם לקומפיילר להציג יותר אזהרות בזמן קומפילציה אזהרות קומפילציה דומות לשגיאות.–הקומפיילר יכול להתעלם מהן.–בד"כ הן מצביעות על טעויות של המתכנת או על קוד שנכתב בצורה לא –

טובה.נעדיף לראות את אזהרות אלו ולחסוך לנו טעויות בהמשך.–

•-Werror .דגל זה מורה לקומפיילר להתייחס לאזהרה כאל שגיאהכלומר הקוד שלכם בקורס חייב להתקמפל גם ללא אזהרות.–בד"כ )ובקורס הזה תמיד( אין סיבה שהקוד שלכם יכיל אזהרות.–

myuser@stud > gcc -o bank -std=c99 -pedantic-errors -Wall -Werror main.c account.cmyuser@stud > gcc -o bank -std=c99 -pedantic-errors -Wall -Werror main.c account.c

22מבוא לתכנות מערכות

Page 23: עבודה ב- T2/Stud

משמשת להשוואת שני קבצי טקסט.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.txt0a1> [Premium Moshe Cohen 54000.00]2c3> [Regular Dani Din 600.00]---> [Regular Dani Din 300.00]

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.txt0a1> [Premium Moshe Cohen 54000.00]2c3> [Regular Dani Din 600.00]---> [Regular Dani Din 300.00]

בדוגמה:•–0a1 : לפני השורה 0בשורה(

הראשונה( יש להוסיף את )מהקובץ השני(1שורה

–:2c3 יש להחליף 2 את שורה מהקובץ השני.3בשורה

.הפלט אינו נוח לקריאהאכן, •

23מבוא לתכנות מערכות

Page 24: עבודה ב- T2/Stud

מלבד צורת הפלט.diff דומה לפקודה sdiffהפקודה •שני הקבצים יוצגו אחד ליד השני.–שורות ארוכות ייחתכו.–כל שורה מהקובץ הראשון תותאם ותוצג ליד שורה מהקובץ השני.–שורות שהותאמו לשורה ריקה או שורה שאינה זהה יוצגו עם תו | מפריד –

ביניהן כדי לסמן הבדלים ביון הקבצים.

•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]

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]

24מבוא לתכנות מערכות

Page 25: עבודה ב- T2/Stud

כדי לבדוק את התכנית שלנו:•נכתוב קבצי קלט וקובץ פלט צפוי.–נריץ את התכנית עם קבצי הקלט.– בכדי לבדוק אם הפלט שהתקבל diff ב-נשתמש–

מתאים לפלט הצפוי.

בעזרת שיטה זו נוכל לוודא את נכונות התכנית •לאחר שינויים בקוד.בצורה אוטומטית

לתכנית בשלב הכנסת קלט ידנית שיטה זו חוסכת •הבדיקה.

25מבוא לתכנות מערכות

Page 26: עבודה ב- T2/Stud

database.txt[Business Yaron Levi 6000.00][Regular Dani Din 600.00]

test1.out[Business Yaron Levi 6000.00][Regular Dani Din 300.00][Premium Moshe Cohen 54000.00]

test.inadd Moshe Cohen Premium 50000.00deposit Moshe Cohen Premium 4000.00withdraw Dani Din Regular 300.00exit

כדי לבדוק את התכנית נכתוב תרחישים •קצרים הבודקים את התכנית

במקרה שלנו נצטרך:•קובץ נתונים התחלתי–קובץ קלט לפקודות–קובץ הפלט הצפוי–

כדי לבדוק את התכנית נריץ את •הפקודות הבאות:

אם לא מודפס כלום התכנית עובדת •כמתוכנן.

אחרת ניתן לנתח את הפלט ולראות מהי •ההתנהגות הלא נכונה.

אפשרות נוספת היא שהתכנית פשוט –תתרסק ולא נגיע לפקודה השנייה.

myuser@stud > ./bank database.txt out.txt > test.inmyuser@stud > diff out.txt test1.outmyuser@stud > ./bank database.txt out.txt > test.inmyuser@stud > diff out.txt test1.out

26מבוא לתכנות מערכות

Page 27: עבודה ב- T2/Stud

היא הסביבה הטקסטואלית בה מורצות הפקודות בשימוש Shellה-•בטרמינל.

.C-Shell הקרויה Shell מופעלת ה-Studבהתחברות ל-–

מכילה קיצורים ע"מ להקל על המשתמש מהקלדה מייגעת Shellכל •של פקודות.

קיצורים בסיסיים המקלים על העבודה:•–TAB.משלים את המילה הנוכחית לשם קובץ או פקודה :ניתן להשתמש בחצים ↑/↓ כדי לעבור על הפקודות האחרונות שבוצעו.–

פופולרי, בפרט:Shellקיצורים אלה עובדים בכל •(Stud )על ה-C-Shellב-–(Linux Ubuntu ברירת המחדל ב-Shell )Bashב-–.Windows ב-Command Promptב-–

27מבוא לתכנות מערכות

Page 28: עבודה ב- T2/Stud

ניתן גם לכתוב מספר פקודות בקובץ טקסט •.sourceולהריץ את פקודות אלו ע"י הפקודה

(.scriptsקבצים אלו נקראים תסריטים )–חומר זה נלמד לעומק בהמשך הקורס, בינתיים –

ניתן לעשות בו שימוש בסיסי אך חשוב.

backup.csh

echo “Backing up code…”

mkdir backup

cp *.c *.h backup

echo “Done”myuser@stud > source backup.cshBacking up code…Donemyuser@stud >

myuser@stud > source backup.cshBacking up code…Donemyuser@stud >

myuser@stud > chmod u+x backup.cshmyuser@stud > backup.cshBacking up code…Donemyuser@stud >

myuser@stud > chmod u+x backup.cshmyuser@stud > backup.cshBacking up code…Donemyuser@stud >

ע"י הוספת הרשאות ריצה לקובץ ניתן להריצו משורת הפקודה כמו תכנית:•

28מבוא לתכנות מערכות

Page 29: עבודה ב- T2/Stud

עכשיו כשאנו יודעים כיצד •ניתן לבדוק בצורה

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

נוחה.יצירת בדיקות הקפידו על –

כבר ותסריט להרצתן בתחילת העבודה

הריצו לאחר כל ביצוע שינוי –בקוד

הרצה קבועה של הבדיקות –תמנע בזבוז זמן בבדיקות ו"פאדיחות" ברגע האחרון.

run_tests.cshgcc -o bank -std=c99 -pedantic-errors -Wall -Werror main.c account.c

echo “Test no.1 )Adding accounts(”./bank database.txt out.txt > test1.indiff out.txt test1.out

echo “Test no.2 )Depositing(”./bank database.txt out.txt > test2.indiff out.txt test2.out

echo Test no.3 )Withdraw(./bank database.txt out.txt > test3.indiff 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 >

myuser@stud > source run_tests.cshTest no.1 )Adding accounts(Test no.2 )Depositing(Test no.3 )Withdraw(myuser@stud >

29מבוא לתכנות מערכות

Page 30: עבודה ב- T2/Stud

.GDBכלי אחרון וחשוב לעבודה במנשק טקסט הוא •–GDB הוא דיבאגר בסיסי המגיע בד"כ עם GCC.

"דיבאגר" היא תכנית המאפשרת להריץ את התכנית שלנו בצורה •מבוקרת ולבדוק את מצב התכנית.

איתור נקודות התרסקות–הדפסת ערכי משתנים–

.g-כאשר מקמפלים את התכנית לצרכי "דיבוג" חשוב להוסיף את הדגל •מוסיף מיפוי לקוד המקור לקובץ ההרצה הבינארי ומאפשר לתכניות כגון –

GDB.לספק מידע מדויק יותר

myuser@stud > gcc -o bank -g -std=c99 -pedantic-errors -Wall -Werror main.c account.cmyuser@stud > gcc -o bank -g -std=c99 -pedantic-errors -Wall -Werror main.c account.c

30מבוא לתכנות מערכות

Page 31: עבודה ב- T2/Stud

קריאת הערך המוצבע ממצביע • תגרום לתכנית NULLשערכו

לעצור בפתאומיות.

בתכנית הנתונה הקריאה – תגרום לקריאת fהשנייה ל-

.NULLהערך ממצביע

הרצה רגילה של התכנית ללא –דיבאגר אינה מספקת מידע

על הסיבה להתרסקות.

#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;

}

#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;

}

myuser@stud > gcc crash.cmyuser@stud > ./a.out10Segmentation faultmyuser@stud >

myuser@stud > gcc crash.cmyuser@stud > ./a.out10Segmentation faultmyuser@stud >

31מבוא לתכנות מערכות

Page 32: עבודה ב- T2/Stud

נריץ את התכנית עם קובץ ההרצה GDBכדי להריץ את •אותו נרצה "לדבג".

•GDB עובדת בעזרת מנשק טקסטואלי. כאשר התכנית הנבדקת אינה רצה תופיע שורת פקודה בה ניתן להכניס

, למשל:GDBפקודות שונות של –runמריצה את התכנית - –continueממשיכה את ריצת התכנית לאחר הפסקה - –step)מריץ שורת קוד אחת בדיוק )נכנס לפונקציה –print מקבל שם משתנה או ביטוי כפרמטר ומדפיס את -

ערכו.Ctrl+zניתן לעצור זמנית את ריצת התכנית ע"י –.Ctrl+Cניתן להפסיק את ריצת התכנית לחלוטין ע"י –

myuser@stud > gdb >binary file>myuser@stud > gdb >binary file>

32מבוא לתכנות מערכות

Page 33: עבודה ב- T2/Stud

כאשר התכנית מנסה •לקרוא כאת את המצביע

GDBההרצה נעצרת ו-מספק מידע מדויק לגבי

מיקום התכנית.

backtraceע"י הפקודה •ניתן להדפיס את מצב

מחסנית הקריאות.במקרה שלנו –

twiceהפונקציה .mainנקראת מ-

myuser@stud > gcc -g crash.cmyuser@stud > gdb -q a.out)gdb( runUsing 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:44 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(

myuser@stud > gcc -g crash.cmyuser@stud > gdb -q a.out)gdb( runUsing 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:44 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(

.GDBעכשיו נריץ את התכנית שוב מתוך • חוסך הדפסה של הודעת הפתיחה.q-הדגל – יכולה לקבל פרמטרים להרצת התכניתrunהפקודה –

33מבוא לתכנות מערכות

Page 34: עבודה ב- T2/Stud

חלק גדול מהבאגים הם שגיאות •התנהגותיות של התכנית.

כדי לבדוק אותן נרצה לעצור את –התכנית, לבדוק את ערכי המשתנים

ולהתקדם צעד צעד.

כדי לעצור את התכנית בשורת קוד •נקודת עצירה מסוימת נוסיף

(breakpoint) ע"י הפקודה break ושם הפונקציה שיש לעצור

בתחילתה

נוכל לבדוק את ערכי המשתנים •.printבעזרת הפקודה

כדי להמשיך בריצת התכנית • )המשך עד continueנשתמש ב-

נקודת העצירה הבאה(

כדי להתקדם בצורה מבוקרת •.stepנשתמש בפקודה

shiroko2@stud > gdb -q a.outUsing host libthread_db library "/lib64/tls/libthread_db.so.1".)gdb( break twiceBreakpoint 1 at 0x4004b0: file crash.c, line 4.)gdb( runStarting program: /u1/115/shiroko2/a.out

Breakpoint 1, twice )ptr=0x7fbffff7dc( at crash.c:44 int result = *ptr + *ptr;)gdb( print ptr$1 = )int *( 0x7fbffff7dc)gdb( print *ptr$2 = 5)gdb( print *ptr+*ptr$3 = 10)gdb( continueContinuing.10

Breakpoint 1, twice )ptr=0x0( at crash.c:44 int result = *ptr + *ptr;

shiroko2@stud > gdb -q a.outUsing host libthread_db library "/lib64/tls/libthread_db.so.1".)gdb( break twiceBreakpoint 1 at 0x4004b0: file crash.c, line 4.)gdb( runStarting program: /u1/115/shiroko2/a.out

Breakpoint 1, twice )ptr=0x7fbffff7dc( at crash.c:44 int result = *ptr + *ptr;)gdb( print ptr$1 = )int *( 0x7fbffff7dc)gdb( print *ptr$2 = 5)gdb( print *ptr+*ptr$3 = 10)gdb( continueContinuing.10

Breakpoint 1, twice )ptr=0x0( at crash.c:44 int result = *ptr + *ptr;

34מבוא לתכנות מערכות

Page 35: עבודה ב- T2/Stud

אינה פשוטה בהתחלה.GDBהעבודה עם •אבל עדיין עדיפה על עבודה ללא דיבאגר.–התחילו בשימוש בפקודות הפשוטות שמוצגות כאן.–ניתן לקבל את רשימת הפקודות המלאה ע"י הפקודה –

help.ולקבל מידע מפורט יותר

בהמשך נלמד שימוש נוסף ב"דיבאגרים" נוחים •יותר.

GDBבפרט נראה מנשקים גרפיים אשר עובדים מעל –ומאפשרים עבודה נוחה יותר.

35מבוא לתכנות מערכות