» נושאי לימוד
» נושאי לימוד
יום רביעי 8 במאי 2024
SICStus Debugger
דף ראשי  שפות תכנות - שפת ++C/C : הידור והרצת תכנית  שפת prolog  SICStus Debugger גרסה להדפסה

 איך משתמשים?

 

במהלך תהליך ניפוי שגיאות (debugging) , ה- debugger מדפיס רצף של יעדים במצבים שונים, כדי להראות לאיזה שלב בהרצה התוכנית הגיעה. אולם כדי להבין מה קורה במערכת יש צורך להבין מתי ולמה ה- debugger מדפיס יעדים אלו.

כמו בשפות תכנות אחרות, נקודות המפתח הן כניסה ויציאה של פרדיקטים, אולם בפרולוג יש תוספת של חזרה לאחור (Backtracking).

 

לפנינו מודל של תהליך ביצוע תכנית בפרולוג. ניתן לראות תרשים זרימה במונחים של תזוזה על טקסט התוכנית. מודל זה מספק בסיס למכניזם של ה- debugging במערכת הפיתוח, ומאפשרת למשתמש לצפות בהתנהגות התוכנית באופן עיקבי.

 

דוגמא:  נסתכל על הדוגמא בפרולוג של הפרדיקט descendant (שושלת) בעזרת הפרדיקט offspring (צאצא):

 

 

 

 

המשפט הראשון מציין ש-Y הוא משושלת X, אם Y הוא צאצא של X.

המשפט השני מציין ש-Z הוא משושלת X אם Y הוא צאצא של X וגם Z הוא משושלת Y.

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

 

ישנם חמישה חצים כאלו:

 

Call – חץ זה מייצג קריאה התחלתית לפרדיקט. כאשר מטרה מהצורה descendant(X,Y)  נידרשת לסיפוק, הבקרה עוברת דרך כניסת ה- Call במטרה להתאים רכיבים וכך לספק את התת-מטרה בגוף הפיסקה.

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

 

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

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

 

Redo – חץ זה מראה שמטרה עוקבת נכשלה והמערכת חוזרת אחורה בניסיון למצוא אלטרנטיבה אחרת לפתרון המטרה הקודמת. הבקרה עוברת בכניסת Redo וייעשה ניסיון לספק מחדש אחד מרכיבי התת מטרה בגוף הפיסקה שהצליח אחרון. או אם זה נכשל, לנסות לבצע התאמה מחדש לגמרי למטרה המקורית עם סעיף אלטרנטיבי ואז לנסות לספק תת-מטרה אחרת.

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

 

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

מבחינה טקסטואלית אנו חוזרים לקוד שקרא לפרדיקט descendant.

 

Exception – חץ זה מייצג חריגה שהועלתה מהמטרה הראשונית. הבקרה יוצאת כעת דרך יציאת Exception והמערכת ממשיכה להעביר את החריגה לרמות אחרות.

מבחינה טקסטואלית אנו חוזרים לקטע קוד שקרא לפרדיקט זה, וממשיכים לחזור במעלה הקוד במטרה למצוא קריאה ל- on_exception/3.

 

 

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

 

 

מבנה הודעות debugging

 

נתבונן במבנה ההודעה המדוייקת הניתנת ע"י המערכת בכניסה/יציאה מהמסגרת.

כל הודעות המעקב נפלטים לפלט השגיאות הסטנדרטי, זה מאפשר לך לעקוב אחרי תכניות כאשר הן מבצעות קלט/פלט לקובץ.

 

המבנה הבסיסי של ההודעה:

 

N  S    23    6     Call : T  foo(hello,there,_123)   ?

 

N  - הוא רק עבור יציאת Exit ומציין האם הבקשה יכלה לחזור אחורה ולמצוא פתרון אלטרנטיבי. אי דטרמיניסטיות היא מקור לחוסר יעילות, ופירוש זה יכול לעזור לנו להבחין בבאגים שקשורים ביעילות. הוא מודפס כ- ? מציין ש- foo/3 יכול לחזור אחורה ולמצוא פתרון אלטרנטיבי.

 

S – מצביע לנקודת מעקב. אם יש נקודת מעקב פשוטה ב- foo/3 הוא מדפיס +, במקרה של תנאי הוא ידפיס *, ובנקודת מעקב כללית ידפיס #. אם אין כלל נקודות מעקב בפרדיקט שעוקבים אחריו הוא ידפיס , .

 

המספר הראשון (23) הוא מזהה הבקשה הייחודי. מספר זה נותן אינדיקציה למספר קריאות הפרוצדורה שבוצעו מאז תחילת הביצוע (execution).

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

 

המספר הבא (6) הוא גובה העומק שבו אנו נמצאים (depth), כלומר כמה אבות קדמונים יש למטרה זו.

 

המילה הבאה (Call) מצביעה על כניסה/יציאה מסויימת מבין ה-5.

 

T הוא מעקב תת-ביטוי. משתמשים בזה בצומת שיש את הפקודה ^.

 

בהמשך מודפסת המטרה foo(hello,there,_123) כך שניתן לבחון את המצב הנוכחי.

 

 

סימן זה ? הוא המנחה המציין שצריך להקליד את אחת הפקודות האפשריות (רשימה חלקית) :

 

h – בקשת עזרה

s – דלג

r – נסה שוב

f – תיכשל (fail)

a – תיכשל (abort)

 

ביציאת exception באה הודעה (לפני ההודעה לעיל) לגבי החריגה העומדת להתרחש.

 25-11-03 / 11:46  עודכן ,  29-10-03 / 09:00  נוצר ע"י חן דרור  בתאריך 
 שפת prolog - הקודםהבא - שפת scheme 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 1