31
- בבבבב בT2 תתתת תתתתתת תתתתתת

עבודה ב- T2

  • Upload
    skip

  • View
    89

  • Download
    2

Embed Size (px)

DESCRIPTION

עבודה ב- T2. מבוא לתכנות מערכות. מה נראה היום?. נלמד עבודה בסיסית בטרמינל. נלמד כיצד לכתוב תוכנית ב- Eclipse . נכיר כלים שימושיים ל- Debugging. התכנית. נכתוב תכנית שמנהלת חשבונות בנק מקבלת כפרמטר קובץ שמכיל את נתוני הלקוחות מחכה לפקודות מהמשתמש - PowerPoint PPT Presentation

Citation preview

Page 1: עבודה ב- T2

T2עבודה ב-

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

Page 2: עבודה ב- T2

מה נראה היום?

נלמד עבודה בסיסית בטרמינל.1.

.Eclipseנלמד כיצד לכתוב תוכנית ב-2.

.Debuggingנכיר כלים שימושיים ל-3.

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

Page 3: עבודה ב- T2

התכנית

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

פלט שמתקבל כפרמטר

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

Page 4: עבודה ב- T2

התכנית

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

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

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]

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

Page 5: עבודה ב- T2

התכנית

התכנית תורכב משני מודולים:•מודול לניהול חשבונות1.

account.c, account.hיורכב מהקבצים •

מודול לקליטת פקודות מהמשתמש2.main.cיורכב מהקובץ •

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

Page 6: עבודה ב- T2

T2: התחברות ל-1שלב

.T2 כדי להתחבר ל-SSHנשתמש ב-•–SSH ניתנת להורדה עבור Windows:מהכתובת

ftp://ftp.cs.technion.ac.il/pub/ssh-client/sshclient.exe

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

קדימה לעבודה...•

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

Page 7: עבודה ב- T2

T2: התחברות ל-1שלב

ניצור את מבנה התיקיות הבא תחת תיקית •הבית:

–mtm•aux_tut

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

Page 8: עבודה ב- T2

: קידוד2שלב

:T2ישנם מספר עורכי טקסט על ה-•–nano

נראה בהמשך...•

–Emacsעורך טקסט מתקדם•מומלץ לנסות•קראו עליו בשקפי הסדנאות המקוריים שבאתר הקורס•

זה בסה"כ כמה שקפים...–

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

Page 9: עבודה ב- T2

: קידוד2שלב

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

~mtm/public/1314b/aux_tut/bank

aux_tut תחת bankאמורה להווצר לנו תיקיית •

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

Page 10: עבודה ב- T2

: קומפילציה3שלב

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

.GCC הקרוי C מותקן קומפיילר Unixברוב מערכות ה-•.GNU Compiler Collectionקיצור עבור –

(.IDEלא להתבלבל בין קומפיילר לסביבת פיתוח )•( Cהקומפיילר הוא תכנית שממירה קבצי קוד )למשל ב-–

לקובץ המכיל קוד אסמבלי, אותו ניתן להריץ.סביבת פיתוח מכילה קומפיילר, דיבאגר ועוד כלים נוספים.–

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

Page 11: עבודה ב- T2

: קומפילציה3שלב

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

.a.outהתקבל קובץ ההרצה •.Windows של EXEדומה לקובץ –

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

Page 12: עבודה ב- T2

GCCדגלים של

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

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

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

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

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

myuser@t2 > gcc -o <exefile> -std=c99 -pedantic-errors -Wall -Werror <.c files>myuser@t2 > gcc -o <exefile> -std=c99 -pedantic-errors -Wall -Werror <.c files>

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

}

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

}

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

Page 13: עבודה ב- T2

GCCדגלים של

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

•-Wall.גורם לקומפיילר להציג את כל האזהרות בזמן קומפילציה אזהרות קומפילציה דומות לשגיאות.–( warnings( מפסיקות את הקומפילציה, בעוד אזהרות )errorsשגיאות )–

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

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

myuser@t2 > gcc -o <exefile> -std=c99 -pedantic-errors -Wall -Werror <.c files>myuser@t2 > gcc -o <exefile> -std=c99 -pedantic-errors -Wall -Werror <.c files>

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

Page 14: עבודה ב- T2

: קומפילציה3שלב

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

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

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

Page 15: עבודה ב- T2

: הרצת ובדיקת התכנית4שלב

כעת נרצה לבדוק האם התכנית שלנו נכונה:•נריץ את התכנית עם קובץ נתונים מוכן מראש.1.

נכניס מספר פקודות לתכנית.2.

נוודא שקובץ הפלט זהה למה שאנו מצפים.3.

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

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

Page 16: עבודה ב- T2

: הרצת ובדיקת התכנית4שלב

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

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

לקובץ הפלט הצפוי.

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

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

איך עושים את זה?!

Page 17: עבודה ב- T2

diffהשוואת טקסט:

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

myuser@t2 > cat file1.txtלשני.[Business Yaron Levi 6000.00][Regular Dani Din 600.00]myuser@t2 > cat file2.txt[Premium Moshe Cohen 54000.00][Business Yaron Levi 6000.00][Regular Dani Din 300.00]myuser@t2 > diff file1.txt file2.txt0a1> [Premium Moshe Cohen 54000.00]2c3< [Regular Dani Din 600.00]---> [Regular Dani Din 300.00]

myuser@t2 > cat file1.txt[Business Yaron Levi 6000.00][Regular Dani Din 600.00]myuser@t2 > cat file2.txt[Premium Moshe Cohen 54000.00][Business Yaron Levi 6000.00][Regular Dani Din 300.00]myuser@t2 > 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בשורה השני מהקובץ

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

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

Page 18: עבודה ב- T2

diffהשוואת טקסט:

אם יש פלט – הקבצים שונים!•אם אין פלט – הקבצים זהים!•

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

Page 19: עבודה ב- T2

sdiffהשוואת טקסט:

•sdiff צורה נוחה יותר להבנת מאפשרתבין קבצים כאשר הם אכן קיימים.ההבדלים

shiroko2@t2 > 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@t2 > 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]

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

Page 20: עבודה ב- T2

: הרצת ובדיקת התכנית4שלב

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

נכתוב קבצי קלט וקובץ פלט צפוי.–נריץ את התכנית עם קבצי הקלט.–האם קובץ הפלט זהה לקובץ diffבעזרת נבדוק –

הפלט הצפוי.

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

Page 21: עבודה ב- T2

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

קובץ נתונים התחלתי–קובץ קלט לפקודות–קובץ הפלט הצפוי–

.testלמזלנו כבר כתבו עבורנו כמה כאלה, בתיקייה •

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

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

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

myuser@t2 > ./bank test/test1.data out.txt < test/test1.inmyuser@t2 > diff out.txt test/test1.outmyuser@t2 > ./bank test/test1.data out.txt < test/test1.inmyuser@t2 > diff out.txt test/test1.out

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

Page 22: עבודה ב- T2

Shellתכונות ה-

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

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

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

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

האחרונות שבוצעו.

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

Page 23: עבודה ב- T2

Scripts

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

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

בחומר.

שמגבה את הקוד Scriptלדוגמה, ניתן לכתוב •שלנו על השרת.

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

Page 24: עבודה ב- T2

: בדיקות אוטומטיות5שלב

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

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

לאפשר בדיקה אוטומטית משופרת.

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

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

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

run_tests.cshgcc -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.indiff out.txt test/test1.out

echo “Test no.2 )Depositing(”./bank test/test2.data out.txt < test/test2.indiff out.txt test/test2.out

echo Test no.3 )Withdraw(./bank test/test3.data out.txt < test/test3.indiff out.txt test/test3.out

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

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

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

Page 25: עבודה ב- T2

: דיבוג6שלב

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

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

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

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

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

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

Page 26: עבודה ב- T2

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;

}

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

}

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

בתיקייה • נמצא הקוד~mtm/public/1314b/aux_tut/crash

Page 27: עבודה ב- T2

GDB vs. Segmentation Fault

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@t2 > gcc crash.cmyuser@t2 > ./a.out10Segmentation faultmyuser@t2 >

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

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

Page 28: עבודה ב- T2

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

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

GDB:למשל ,–runמריצה את התכנית - –continueממשיכה את ריצת התכנית לאחר הפסקה - –step)מריץ שורת קוד אחת בדיוק )נכנס לפונקציה –printמקבל שם משתנה או ביטוי כפרמטר ומדפיס את ערכו - .Ctrl+zניתן לעצור זמנית את ריצת התכנית ע"י –.Ctrl+Cניתן להפסיק את ריצת התכנית לחלוטין ע"י –

GDB vs. Segmentation Fault

myuser@t2 > gdb <binary file>myuser@t2 > gdb <binary file>

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

Page 29: עבודה ב- T2

GDB vs. Segmentation Fault

backtraceע"י •ניתן להדפיס את

מחסנית הקריאות.

במקרה שלנו – twiceהפונקציה .mainנקראת מ-

myuser@t2 > gcc -g crash.cmyuser@t2 > 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@t2 > gcc -g crash.cmyuser@t2 > 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(

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

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

Page 30: עבודה ב- T2

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

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

נקודת עצירה כדי לעצור את התכנית בשורת קוד מסוימת נוסיף •(breakpoint) ע"י הפקודה breakושם הפונקציה שיש לעצור בתחילתה

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

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

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

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

Page 31: עבודה ב- T2

GDBסיכום :

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

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

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