המצגת נטענת. אנא המתן

המצגת נטענת. אנא המתן

עבודה ב-T2 מבוא לתכנות מערכות.

מצגות קשורות


מצגת בנושא: "עבודה ב-T2 מבוא לתכנות מערכות."— תמליל מצגת:

1 עבודה ב-T2 מבוא לתכנות מערכות

2 מה נראה היום? נלמד עבודה בסיסית בטרמינל.
נלמד כיצד לכתוב תוכנית ב-Eclipse. נכיר כלים שימושיים ל-Debugging. מבוא לתכנות מערכות

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

4 התכנית database.txt [Business Yaron Levi 6000.00]
[Regular Dani Din ] > bank database.txt database2.txt add Moshe Cohen Premium deposit Moshe Cohen Premium withdraw Dani Din Regular exit > database2.txt [Business Yaron Levi ] [Regular Dani Din ] [Premium Moshe Cohen ] מבוא לתכנות מערכות

5 התכנית התכנית תורכב משני מודולים: מודול לניהול חשבונות
יורכב מהקבצים account.c, account.h מודול לקליטת פקודות מהמשתמש יורכב מהקובץ main.c מבוא לתכנות מערכות

6 שלב 1: התחברות ל-T2 נשתמש ב-SSH כדי להתחבר ל-T2. קדימה לעבודה...
SSH ניתנת להורדה עבור Windows מהכתובת: ftp://ftp.cs.technion.ac.il/pub/ssh-client/sshclient.exe עבור לינוקס (או OSX) ניתן פשוט לפתוח חלון טרמינל ולהשתמש בפקודה “ssh”. קדימה לעבודה... מבוא לתכנות מערכות

7 שלב 1: התחברות ל-T2 ניצור את מבנה התיקיות הבא תחת תיקית הבית: mtm
aux_tut מבוא לתכנות מערכות

8 שלב 2: קידוד ישנם מספר עורכי טקסט על ה-T2: nano Emacs נראה בהמשך...
עורך טקסט מתקדם מומלץ לנסות קראו עליו בשקפי הסדנאות המקוריים שבאתר הקורס זה בסה"כ כמה שקפים... מבוא לתכנות מערכות

9 שלב 2: קידוד כעת נוותר על הקידוד ונעתיק את קבצי התכנית מהתיקייה ~mtm/public/1314b/aux_tut/bank אמורה להווצר לנו תיקיית bank תחת aux_tut מבוא לתכנות מערכות

10 שלב 3: קומפילציה לאחר כתיבת הקוד, אנו רוצים להריץ את התכנית.
לפני כן, יש לקמפל את הקוד. ברוב מערכות ה-Unix מותקן קומפיילר C הקרוי GCC. קיצור עבור GNU Compiler Collection. לא להתבלבל בין קומפיילר לסביבת פיתוח (IDE). הקומפיילר הוא תכנית שממירה קבצי קוד (למשל ב-C) לקובץ המכיל קוד אסמבלי, אותו ניתן להריץ. סביבת פיתוח מכילה קומפיילר, דיבאגר ועוד כלים נוספים. בהמסך הסמסטר נעבור לתכנות בשפת ++C. GCC מסוגל להדר גם את שפה זו אך במקרים אלו נשתמש בפקודה g++ כדי לקמפל את הקוד. GNU Compiler Collection - מקור השם הוא בגלל ש-GCC מכיל קומפיילרים גם לשפות נוספות (בפרט לשפת ++C כמו שהוזכר לעיל). מבוא לתכנות מערכות

11 שלב 3: קומפילציה נריץ את הקומפיילר עם קבצי הקוד כפרמטרים.
התקבל קובץ ההרצה a.out. דומה לקובץ EXE של Windows. אין צורך להוסיף הרשאות ריצה לקובץ זה מאחר והדבר נעשה אוטומטית ע"י GCC. מבוא לתכנות מערכות

12 דגלים של GCC בקורס זה נקמפל את התכניות שלנו עם שורת הפקודה הבאה:
-o <exefile>מורה לקומפיילר לכתוב את קובץ הפלט לקובץ ששמו exefile במקום לברירת המחדל a.out. -std=c99 קובע את סטנדרט השפה לפיו הקומפיילר יעבוד. הסטדרנט בקורס הוא C99. ב-C99 ניתן להגדיר משתנים לא רק בתחילת בלוק, ואף בתחילת לולאת for: -pedantic-errors מכריח את הקומפיילר להקפיד על הסטנדרט הנבחר ולפלוט שגיאות על הפרות שלו. > gcc -o <exefile> -std=c99 -pedantic-errors -Wall -Werror <.c files> for (int i = 0; i < n; ++i) { printf("%d\n", i); } מבוא לתכנות מערכות

13 דגלים של GCC בקורס זה נקמפל את התכניות שלנו עם שורת הפקודה הבאה:
-Wall גורם לקומפיילר להציג את כל האזהרות בזמן קומפילציה. אזהרות קומפילציה דומות לשגיאות. שגיאות (errors) מפסיקות את הקומפילציה, בעוד אזהרות (warnings) לא. בד"כ מצביעות על טעויות מתכנת או על קוד שנכתב בצורה לא טובה. נעדיף לראות את אזהרות אלו ולחסוך לנו טעויות בהמשך. -Werror מורה לקומפיילר להתייחס לאזהרה כאל שגיאה. כלומר הקוד שלכם בקורס חייב להתקמפל גם ללא אזהרות. בד"כ (ובקורס הזה תמיד) אין סיבה שהקוד שלכם יכיל אזהרות. > gcc -o <exefile> -std=c99 -pedantic-errors -Wall -Werror <.c files> מומלץ להשתמש בדגלים אלו תמיד. בפרט בדגלי -Wall ו--std=c99 שלהם תרומה רבה ביצירת קוד קריא יותר והגנה על המתכנת מבזבוז זמן עבור שגיאות טפשיות. מבוא לתכנות מערכות

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

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

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

17 השוואת טקסט: diff הפקודה diff משמשת להשוואת שני קבצי טקסט. בדוגמה:
אם הקבצים זהים לא יודפס כלום. אם הם שונים יודפסו השינויים שיש לבצע על הקובץ הראשון כדי להפכו לשני. > cat file1.txt [Business Yaron Levi ] [Regular Dani Din ] > cat file2.txt [Premium Moshe Cohen ] [Regular Dani Din ] > diff file1.txt file2.txt 0a1 > [Premium Moshe Cohen ] 2c3 < [Regular Dani Din ] --- > [Regular Dani Din ] בדוגמה: 0a1: בשורה 0 (לפני השורה הראשונה) יש להוסיף את שורה 1 (מהקובץ השני) :2c3 את שורה 2 יש להחליף בשורה 3 מהקובץ השני. אכן, הפלט אינו נוח לקריאה. השימוש העיקרי לפקודת diff שדווקא לא יתורגל בקורס הוא בהשוואת חלקי קוד. פקודה זו מאפשרת בצורה נוחה למתכנת לראות אילו שינויים הוכנסו בקובץ ולמצוא בקלות הבדלי גרסאות. מבוא לתכנות מערכות

18 השוואת טקסט: diff אם יש פלט – הקבצים שונים! אם אין פלט – הקבצים זהים!
פקודה זו מאפשרת בצורה נוחה למתכנת לראות אילו שינויים הוכנסו בקובץ ולמצוא בקלות הבדלי גרסאות. מבוא לתכנות מערכות

19 השוואת טקסט: sdiff sdiff מאפשרת צורה נוחה יותר להבנת ההבדלים בין קבצים כאשר הם אכן קיימים. > diff file1.txt file2.txt > [Premium Moshe Cohen ] [Business Yaron Levi ] [Business Yaron Levi ] [Regular Dani Din ] | [Regular Dani Din ] כאשר הקבצים זהים, פקודה זו פחות נוחה מאחר והיא מדפיסה את שני הקבצים למסך תמיד (גם שורות זהות). לכן מומלץ להשתמש בה כאשר הפלט של diff אינו נוח להבנה (בד"כ כל מקרה שבו diff לא מחזירה פלט ריק) כאשר עובדים במנשק גרפי יש כלים נוחים עוד יותר לביצוע השוואות אלו. - ניתן לנסות את הפקודה kompare ב-T2. - ניתן להוריד את התוכנה WinMerge ל-Windows. - ב-Eclipse ניתן בתפריט האפשרויות עבור כל קובץ בפרויקט ניתן לבחור בתת התפריט Compare With ושם להשוות את הקובץ עם גרסאות קודמות או לבחור שני קבצים ולהשוות אותם אחד עם השני. מבוא לתכנות מערכות

20 שלב 4: הרצת ובדיקת התכנית
נרצה לפתח שיטה אוטומטית לבדיקת התכנית: נכתוב קבצי קלט וקובץ פלט צפוי. נריץ את התכנית עם קבצי הקלט. נבדוק בעזרת diff האם קובץ הפלט זהה לקובץ הפלט הצפוי. מבוא לתכנות מערכות

21 שלב 4: הרצת ובדיקת התכנית
נכתוב תרחישים קצרים הבודקים את התכנית קובץ נתונים התחלתי קובץ קלט לפקודות קובץ הפלט הצפוי למזלנו כבר כתבו עבורנו כמה כאלה, בתיקייה test. כדי לבדוק את התכנית נריץ את הפקודות הבאות: אם לא מודפס כלום התכנית עובדת כמתוכנן. אחרת ננתח את הפלט ונבדוק מהי ההתנהגות הלא נכונה. אפשר גם שהתכנית תתרסק ולא נגיע לפקודה השנייה. > ./bank test/test1.data out.txt < test/test1.in > diff out.txt test/test1.out מבוא לתכנות מערכות

22 תכונות ה-Shell ה-Shell היא הסביבה הטקסטואלית בה מורצות הפקודות בשימוש בטרמינל. בהתחברות ל-T2 מופעלת ה-Shell הקרויה Bash. כל Shell מכילה קיצורים ע"מ להקל על המשתמש. קיצורים בסיסיים המקלים על העבודה: TAB: משלים את המילה הנוכחית לשם קובץ או פקודה. ניתן להשתמש בחצים ↑/↓ כדי לעבור על הפקודות האחרונות שבוצעו. מבוא לתכנות מערכות

23 Scripts ניתן לכתוב מספר פקודות בקובץ טקסט ולהריץ אותן ע"י הפקודה source. קבצים אלו נקראים תסריטים (scripts). כרגע נכיר בצורה בסיסית, ובהמשך הקורס נעמיק בחומר. לדוגמה, ניתן לכתוב Script שמגבה את הקוד שלנו על השרת. השימוש בסביבת C-Shell ב-Unix וכתיבת תסריטים (scripts) יילמד בתרגולים 6-7 ובתרגלי בית מס' 3. הרצות script בצורה זו עובדות רק בסביבת Unix (קיים מנגנון דומה תחת Windows שאינו בחומר הקורס). מבוא לתכנות מערכות

24 שלב 5: בדיקות אוטומטיות אנו יודעים כיצד לבדוק את התכנית בצורה אוטומטית. אנו יודעים לכתוב תסריטים. נאחד את השיטות כדי לאפשר בדיקה אוטומטית משופרת. הקפידו על יצירת בדיקות ותסריט להרצתן כבר בתחילת העבודה הריצו לאחר כל שינוי בקוד הרצה קבועה של הבדיקות תמנע בזבוז זמן בבדיקות ו"פאדיחות" ברגע האחרון. run_tests.csh gcc -o bank -std=c99 -pedantic-errors -Wall -Werror main.c account.c echo “Test no.1 (Adding accounts)” ./bank test/test1.data out.txt < test/test1.in diff out.txt test/test1.out echo “Test no.2 (Depositing)” ./bank test/test2.data out.txt < test/test2.in diff out.txt test/test2.out echo Test no.3 (Withdraw) ./bank test/test3.data out.txt < test/test3.in diff out.txt test/test3.out > source run_tests.csh Test no.1 (Adding accounts) Test no.2 (Depositing) Test no.3 (Withdraw) > מבוא לתכנות מערכות

25 שלב 6: דיבוג כלי אחרון וחשוב לעבודה במנשק טקסט הוא GDB.
GDB הוא דיבאגר בסיסי המגיע בד"כ עם GCC. "דיבאגר" מאפשר להריץ את התכנית שלנו בצורה מבוקרת ולבדוק את מצב התכנית. איתור נקודות התרסקות הדפסת ערכי משתנים כאשר מקמפלים את התכנית לצרכי "דיבוג" חשוב להוסיף את הדגל -g. עוזר ל-GDB לספק לנו מידע מקיף יותר. > gcc -o bank -g -std=c99 -pedantic-errors -Wall -Werror main.c account.c מבוא לתכנות מערכות

26 GDB vs. Segmentation Fault
#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; נביט בתכנית הנתונה משמאל הקוד נמצא בתיקייה ~mtm/public/1314b/aux_tut/crash מבוא לתכנות מערכות

27 GDB vs. Segmentation Fault
#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. הרצה רגילה של התכנית ללא דיבאגר אינה מספקת מידע על הסיבה להתרסקות. > gcc crash.c > ./a.out 10 Segmentation fault > מבוא לתכנות מערכות

28 GDB vs. Segmentation Fault
GDB עובדת בעזרת מנשק טקסטואלי. כאשר התכנית הנבדקת אינה רצה תופיע שורת פקודה בה ניתן להכניס פקודות שונות של GDB, למשל: run - מריצה את התכנית continue - ממשיכה את ריצת התכנית לאחר הפסקה step מריץ שורת קוד אחת בדיוק (נכנס לפונקציה) print - מקבל שם משתנה או ביטוי כפרמטר ומדפיס את ערכו ניתן לעצור זמנית את ריצת התכנית ע"י Ctrl+z. ניתן להפסיק את ריצת התכנית לחלוטין ע"י Ctrl+C. > gdb <binary file> מבוא לתכנות מערכות

29 GDB vs. Segmentation Fault
הדגל -q חוסך הדפסה של הודעת הפתיחה. הפקודה run יכולה לקבל פרמטרים להרצת התכנית > gcc -g crash.c > 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. 0x b4 in twice (ptr=0x0) at crash.c:4 int result = *ptr + *ptr; (gdb) backtrace #0 0x b4 in twice (ptr=0x0) at crash.c:4 #1 0x fa in main () at crash.c:12 (gdb) ע"י backtrace ניתן להדפיס את מחסנית הקריאות. במקרה שלנו הפונקציה twice נקראת מ-main. מבוא לתכנות מערכות

30 Breakpoints חלק גדול מהבאגים הם שגיאות התנהגותיות של התכנית.
כדי לבדוק אותן נרצה לעצור את התכנית, לבדוק את ערכי המשתנים ולהתקדם צעד צעד. כדי לעצור את התכנית בשורת קוד מסוימת נוסיף נקודת עצירה (breakpoint) ע"י הפקודה break ושם הפונקציה שיש לעצור בתחילתה נוכל לבדוק את ערכי המשתנים בעזרת הפקודה print. כדי להמשיך בריצת התכנית נשתמש ב-continue (המשך עד נקודת העצירה הבאה) כדי להתקדם בצורה מבוקרת נשתמש בפקודה step. מבוא לתכנות מערכות

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


הורד את "ppt "עבודה ב-T2 מבוא לתכנות מערכות.

מצגות קשורות


מודעות Google