Upload
skip
View
89
Download
2
Embed Size (px)
DESCRIPTION
עבודה ב- T2. מבוא לתכנות מערכות. מה נראה היום?. נלמד עבודה בסיסית בטרמינל. נלמד כיצד לכתוב תוכנית ב- Eclipse . נכיר כלים שימושיים ל- Debugging. התכנית. נכתוב תכנית שמנהלת חשבונות בנק מקבלת כפרמטר קובץ שמכיל את נתוני הלקוחות מחכה לפקודות מהמשתמש - PowerPoint PPT Presentation
Citation preview
T2עבודה ב-
מערכות לתכנות מבוא
מה נראה היום?
נלמד עבודה בסיסית בטרמינל.1.
.Eclipseנלמד כיצד לכתוב תוכנית ב-2.
.Debuggingנכיר כלים שימושיים ל-3.
2מבוא לתכנות מערכות
התכנית
נכתוב תכנית שמנהלת חשבונות בנק•מקבלת כפרמטר קובץ שמכיל את נתוני הלקוחות–מחכה לפקודות מהמשתמש–בסיום הריצה שומרת את נתוני הלקוחות בקובץ –
פלט שמתקבל כפרמטר
3מבוא לתכנות מערכות
התכנית
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מבוא לתכנות מערכות
התכנית
התכנית תורכב משני מודולים:•מודול לניהול חשבונות1.
account.c, account.hיורכב מהקבצים •
מודול לקליטת פקודות מהמשתמש2.main.cיורכב מהקובץ •
5מבוא לתכנות מערכות
T2: התחברות ל-1שלב
.T2 כדי להתחבר ל-SSHנשתמש ב-•–SSH ניתנת להורדה עבור Windows:מהכתובת
ftp://ftp.cs.technion.ac.il/pub/ssh-client/sshclient.exe
( ניתן פשוט לפתוח חלון OSXעבור לינוקס )או –”.sshטרמינל ולהשתמש בפקודה “
קדימה לעבודה...•
6מבוא לתכנות מערכות
T2: התחברות ל-1שלב
ניצור את מבנה התיקיות הבא תחת תיקית •הבית:
–mtm•aux_tut
7מבוא לתכנות מערכות
: קידוד2שלב
:T2ישנם מספר עורכי טקסט על ה-•–nano
נראה בהמשך...•
–Emacsעורך טקסט מתקדם•מומלץ לנסות•קראו עליו בשקפי הסדנאות המקוריים שבאתר הקורס•
זה בסה"כ כמה שקפים...–
8מבוא לתכנות מערכות
: קידוד2שלב
כעת נוותר על הקידוד ונעתיק את קבצי •התכנית מהתיקייה
~mtm/public/1314b/aux_tut/bank
aux_tut תחת bankאמורה להווצר לנו תיקיית •
9מבוא לתכנות מערכות
: קומפילציה3שלב
לאחר כתיבת הקוד, אנו רוצים להריץ את התכנית.• את הקוד.לקמפללפני כן, יש •
.GCC הקרוי C מותקן קומפיילר Unixברוב מערכות ה-•.GNU Compiler Collectionקיצור עבור –
(.IDEלא להתבלבל בין קומפיילר לסביבת פיתוח )•( Cהקומפיילר הוא תכנית שממירה קבצי קוד )למשל ב-–
לקובץ המכיל קוד אסמבלי, אותו ניתן להריץ.סביבת פיתוח מכילה קומפיילר, דיבאגר ועוד כלים נוספים.–
10מבוא לתכנות מערכות
: קומפילציה3שלב
נריץ את הקומפיילר עם קבצי הקוד •כפרמטרים.
.a.outהתקבל קובץ ההרצה •.Windows של EXEדומה לקובץ –
11מבוא לתכנות מערכות
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מבוא לתכנות מערכות
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מבוא לתכנות מערכות
: קומפילציה3שלב
כעת נקמפל את התכנית מחדש בעזרת כל •הדגלים הדרושים.
נחזיק אצבעות שלא נקבל אזהרות מהקומפיילר...–
14מבוא לתכנות מערכות
: הרצת ובדיקת התכנית4שלב
כעת נרצה לבדוק האם התכנית שלנו נכונה:•נריץ את התכנית עם קובץ נתונים מוכן מראש.1.
נכניס מספר פקודות לתכנית.2.
נוודא שקובץ הפלט זהה למה שאנו מצפים.3.
זוהי השיטה הידנית, והיא אינה יעילה כאשר •מבצעים שינוי קטן בקוד.
15מבוא לתכנות מערכות
: הרצת ובדיקת התכנית4שלב
נרצה לפתח שיטה אוטומטית לבדיקת •התכנית:
נכתוב קבצי קלט וקובץ פלט צפוי.–נריץ את התכנית עם קבצי הקלט.– האם קובץ הפלט זהה בצורה אוטומטיתנבדוק –
לקובץ הפלט הצפוי.
לתכנית הכנסת קלט ידנית שיטה זו חוסכת •בשלב הבדיקה.
16מבוא לתכנות מערכות
איך עושים את זה?!
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מבוא לתכנות מערכות
diffהשוואת טקסט:
אם יש פלט – הקבצים שונים!•אם אין פלט – הקבצים זהים!•
18מבוא לתכנות מערכות
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מבוא לתכנות מערכות
: הרצת ובדיקת התכנית4שלב
נרצה לפתח שיטה אוטומטית לבדיקת •התכנית:
נכתוב קבצי קלט וקובץ פלט צפוי.–נריץ את התכנית עם קבצי הקלט.–האם קובץ הפלט זהה לקובץ diffבעזרת נבדוק –
הפלט הצפוי.
20מבוא לתכנות מערכות
: הרצת ובדיקת התכנית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מבוא לתכנות מערכות
Shellתכונות ה-
היא הסביבה הטקסטואלית בה מורצות Shellה-•הפקודות בשימוש בטרמינל.
.Bash הקרויה Shell מופעלת ה-T2בהתחברות ל-–
מכילה קיצורים ע"מ להקל על המשתמש.Shellכל •
קיצורים בסיסיים המקלים על העבודה:•–TAB.משלים את המילה הנוכחית לשם קובץ או פקודה :ניתן להשתמש בחצים ↑/↓ כדי לעבור על הפקודות –
האחרונות שבוצעו.
22מבוא לתכנות מערכות
Scripts
ניתן לכתוב מספר פקודות בקובץ טקסט •.sourceולהריץ אותן ע"י הפקודה
(.scriptsקבצים אלו נקראים תסריטים )–כרגע נכיר בצורה בסיסית, ובהמשך הקורס נעמיק –
בחומר.
שמגבה את הקוד Scriptלדוגמה, ניתן לכתוב •שלנו על השרת.
23מבוא לתכנות מערכות
: בדיקות אוטומטיות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מבוא לתכנות מערכות
: דיבוג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מבוא לתכנות מערכות
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
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מבוא לתכנות מערכות
עם קובץ ההרצה שנרצה לדבג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מבוא לתכנות מערכות
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מבוא לתכנות מערכות
Breakpointsחלק גדול מהבאגים הם שגיאות התנהגותיות של התכנית.•כדי לבדוק אותן נרצה לעצור את התכנית, לבדוק את ערכי המשתנים •
ולהתקדם צעד צעד.
נקודת עצירה כדי לעצור את התכנית בשורת קוד מסוימת נוסיף •(breakpoint) ע"י הפקודה breakושם הפונקציה שיש לעצור בתחילתה
.printנוכל לבדוק את ערכי המשתנים בעזרת הפקודה •
)המשך עד נקודת continueכדי להמשיך בריצת התכנית נשתמש ב-•העצירה הבאה(
.stepכדי להתקדם בצורה מבוקרת נשתמש בפקודה •
30מבוא לתכנות מערכות
GDBסיכום :
אינה פשוטה בהתחלה.GDBהעבודה עם •עדיין עדיפה על עבודה ללא דיבאגר.–התחילו בשימוש בפקודות הפשוטות שמוצגות כאן.–ניתן לקבל את רשימת הפקודות המלאה ע"י –
ולקבל מידע מפורט יותר.helpהפקודה
31מבוא לתכנות מערכות