מה זאת אומרת Debugging ולמה אני צריך את זה?
Debugging הוא למעשה תהליך תיקון התקלות בקוד.
כמעט תמיד (לא כמעט. תמיד) בעת הפיתוח, נוצרים מצבים בהם הקוד לא רץ בדיוק כמו שתכננו.
לפעמים המצבים האלו נובעים מהשגיאות שלנו כמפתחים ולפעמים ממצבים לא צפויים כמו קלט שגוי מהמשתמש.
אתם יכולים לחשוב על תהליך הפיתוח כבנוי משלבים (מזכיר לכם משהו?) -
- כותבים קוד
- מריצים
- הקוד לא עובד: עוברים ל-3
- הקוד עובד: עוברים ל-1
- מנסים לברר למה
- מקללים (לא חובה)
- מוצאים את השגיאה
- מתקנים
- חוזרים ל-2
ניקח למשל תוכנית קצרה ב javascript המקבלת מספר מהמשתמש ומעלה את המספר בריבוע:
var input = parseFloat(prompt("Input please (any number):", "")); alert(input * input);
על המסך תוצג ההודעה המקבלת קלט מהמשתמש, אבל הנה הבעיה, אנחנו יודעים ש prompt מקבלת כל מחרוזת מהמשתמש - למשל:
קבלת ערך לא צפוי מהמשתמש |
במידה והמשתמש יאשר את המחרוזת, הפונקציה parseFloat תחזיר את הערך המיוחד NaN או Not a Number שבסופו של דבר ישמר במשתנה input.
אחר כך, כשנריץ את הביטוי input * input, נקבל תוצאה לא צפויה.
העניין הוא שלא תמיד הבאגים פשוטים למציאה, אפשר להגיד שברוב המקרים קשה לאתר אותם, אחרת היינו מונעים אותם מראש, ולא תמיד הם נובעים מקלט שגוי.
הרבה פעמים פשוט נרצה לדעת מה ערכו של משתנה אחד או יותר ברגע נתון בקוד - למשל באיטרציה ה-567 של לולאה מסוימת - או מיד לאחר חישוב.
במילים אחרות נרצה לעצור את הזמן בנקודה מסוימת ולגרום לקוד לחכות רק עד שנברר מה קורה בדיוק.
ישנם קטעי קוד בהם קשה יותר לאתר באגים - למשל לולאות, או רקורסיות (בלתי אפשרי).
מכיוון שנדרש זמן וניסיון כדי לפתח אינטואיציה ולחזות שגיאות במקרים כאלו, עומדים לרשותנו כלים שונים שיכולים לסייע במציאת השגיאות - או להגיד לנו בדיוק מה קורה (מה ערכם של המשתנים) בכל רגע נתון.
הכלי הראשון הוא כמובן טבלת מעקב (ראינו בשיעור אלגוריתמים), אבל היא לא כל כך פרקטית כשמדובר בלולאות של 1000 או 10000 איטרציות.
אפשרות נוספת היא שימוש בפונקציה ()alert, אחת התכונות החשובות של alert היא עצירת הקוד, לכן נוכל להדפיס ב alert כל ערך משתנה שנרצה ברגע נתון ו"להגיד" לקוד להמתין:
var i = 1000; var input = parseFloat(prompt("Enter num","")); while (i > 0) { input = input / 2; // Stop the loop at the 567th iteration // and check the value of input if (i == 433) { alert(input); // Wait a second, checking input } i--; }
אבל גם לשיטה הזאת יש חסרונות כשרוצים לבדוק ערכים של יותר ממשתנה אחד (צריכים להתחיל לעבוד קשה בשביל להציג את כל הערכים שאנחנו רוצים) ובנוסף אנחנו עלולים לשכוח למחוק את ההודעה אחרי שסיימנו לדבג.
כלי נוסף, נחמד יותר הוא ה Firebug.
כלי נוסף, נחמד יותר הוא ה Firebug.
Firebug ונהנים
Firebug, למי שעדיין לא מכיר, הוא תוסף לדפדפן Firefox המספק לנו אוסף כלים עשיר (ונפלא) לתיקון תקלות בקוד לקוח.
Firebug הפך לאחד הכלים (אם לא ה..) הכי פופולארים בקרב מפתחי client מאחר והוא הראשון שסיפק את האפשרות ל debugging בתוך הדפדפן והפך פיתוח ב Javascript למזעזע הרבה פחות.
ההצלחה של Firebug לא נעלמה מעיניהן של מפתחות הדפדפנים הגדולות (Microsoft, Apple, Google, Opera) שהוסיפו כלים דומים מובנים (Built-in) בתוך הדפדפן (תוכלו לראות על ידי לחיצה על F12) .
כדי להשתמש ב Firebug המקורי, אתם צריכים להצטייד בדפדפן Firefox ולהתקין את התוסף מכאן.
ישנם שני כלים חשובים בכל מה שנוגע ל javascript -
ה Console מאפשר לכם להריץ פקודות javascript מתוך הדפדפן ובשידור חי! כלומר, כל פקודה שתכניסו תתבצע באותו רגע. ואם זה לא מספיק, ה Console גם ידאג לעזור לכם ולהשלים פקודות חלקיות.
לא מאמינים? לחצו על הלשונית Console ועל הקישור enable כדי לאפשר את השימוש בו:
הקישו al בתיבת הקלט ותראו מה קורה:
לחצו על המקש tab כדי להשלים את המילה והריצו כל פקודה שתרצו:
מיד לאחר הרצת השורה (הקשה על Enter), יופיע חלון ה prompt - אליו נוכל להכניס קלט.
ה- Console עוזר לנו אפילו להציג ערכי משתנים.
אחרי הקשת ערך בחלון ה prompt, הכניסו ל Console רק את שם המשתנה והקישו Enter:
השורה האדומה מציגה את ערכו של המשתנה userInput.
אם אתם רוצים להריץ כמה שורות קוד ביחד, למשל לולאה, תוכלו להשתמש ב Command Editor, למטה מצד ימין:
הכניסו כמה פקודות שתרצו ולחצו על Run:
חשוב לציין שה Console יכול להציג ערכי משתנים קיימים בדף, כלומר, תוכלו לקרוא מה Console למשתנים המוגדרים בסקריפט המקורי. כמובן שנוכל גם לקרוא לפונקציות שמוגדרות בדף..
כדי להשתמש ב debugger, פתחו את הדף בו נמצא הקוד ולחצו על לשונית ה- Script:
מצאו את השורה בה תרצו לעצור וסמנו אותה עם Break point (הנקודה שבה אנחנו עוצרים את הריצה השוטפת של הקוד) על ידי לחיצה על מספר השורה (בצד שמאל):
ברגע שתראו נקודה אדומה בסמוך לשורה, תדעו שהשורה "סומנה" ובפעם הבאה, רגע לפני שתתבצע השורה, Firebug יעצור ויסמן אותה, תוכלו לגרום לשורה לרוץ שוב על ידי רענון הדף (firebug זוכר שסימנתם את השורה).
פה קורה הקסם. שימו לב שמצד ימין מופיעים כל המשתנים הפעילים וערכיהם בזמן אמיתי, לא רק זה, נוכל גם לעבור עם העכבר מעל המשתנים בחלונית הקוד ולראות את ערכם.
העבודה עם ה debugger מאוד פשוטה (עם מקשי מקלדת):
נוכל להשתמש בחלונית ה watch כדי לעקוב אחר ביטויים / משתנים בזמן אמת.
מצד ימין בחלונית המעקב - שימו לב לתיבת טקסט הצהובה:
כאן למשל אני בודק אם ערכו של i גדול מ 2 בכל רגע נתון:
Firebug מציע לנו את כל זה (בחינם!) ועוד יותר. הדרך הכי טובה להכיר את הכלי היא פשוט לשחק איתו. מבטיח שזה ישתלם.
Firebug הפך לאחד הכלים (אם לא ה..) הכי פופולארים בקרב מפתחי client מאחר והוא הראשון שסיפק את האפשרות ל debugging בתוך הדפדפן והפך פיתוח ב Javascript למזעזע הרבה פחות.
ההצלחה של Firebug לא נעלמה מעיניהן של מפתחות הדפדפנים הגדולות (Microsoft, Apple, Google, Opera) שהוסיפו כלים דומים מובנים (Built-in) בתוך הדפדפן (תוכלו לראות על ידי לחיצה על F12) .
כדי להשתמש ב Firebug המקורי, אתם צריכים להצטייד בדפדפן Firefox ולהתקין את התוסף מכאן.
ישנם שני כלים חשובים בכל מה שנוגע ל javascript -
ה- Console
כלי מדהים ושימושי מאוד ללמידה.ה Console מאפשר לכם להריץ פקודות javascript מתוך הדפדפן ובשידור חי! כלומר, כל פקודה שתכניסו תתבצע באותו רגע. ואם זה לא מספיק, ה Console גם ידאג לעזור לכם ולהשלים פקודות חלקיות.
לא מאמינים? לחצו על הלשונית Console ועל הקישור enable כדי לאפשר את השימוש בו:
אפשר את השימוש ב Console |
הקישו al בתיבת הקלט ותראו מה קורה:
Firebug - שימוש בהשלמה אוטומטית |
לחצו על המקש tab כדי להשלים את המילה והריצו כל פקודה שתרצו:
שימוש ב- Console (לחץ להגדלה) |
מיד לאחר הרצת השורה (הקשה על Enter), יופיע חלון ה prompt - אליו נוכל להכניס קלט.
ה- Console עוזר לנו אפילו להציג ערכי משתנים.
אחרי הקשת ערך בחלון ה prompt, הכניסו ל Console רק את שם המשתנה והקישו Enter:
השורה האדומה מציגה את ערכו של המשתנה userInput.
אם אתם רוצים להריץ כמה שורות קוד ביחד, למשל לולאה, תוכלו להשתמש ב Command Editor, למטה מצד ימין:
הכניסו כמה פקודות שתרצו ולחצו על Run:
Firebug - Command Editor |
חשוב לציין שה Console יכול להציג ערכי משתנים קיימים בדף, כלומר, תוכלו לקרוא מה Console למשתנים המוגדרים בסקריפט המקורי. כמובן שנוכל גם לקרוא לפונקציות שמוגדרות בדף..
ה - Debugger
אז עכשיו לענייננו, אם אנחנו לא רוצים להתעסק עם ה console אבל כן רוצים להבין מדוע הקוד שלנו לא עובד, נוכל להיעזר ב Debugger. הכלי הזה מאפשר לנו לסמן שורה בקוד, ורגע לפני שהשורה תתבצע, Firebug ידאג לעצור את התוכנית כדי שנוכל לדעת מה קורה באותו רגע. בדיוק מה שרצינו.כדי להשתמש ב debugger, פתחו את הדף בו נמצא הקוד ולחצו על לשונית ה- Script:
Firebug - עבודה עם ה Debugger |
מצאו את השורה בה תרצו לעצור וסמנו אותה עם Break point (הנקודה שבה אנחנו עוצרים את הריצה השוטפת של הקוד) על ידי לחיצה על מספר השורה (בצד שמאל):
Firebug - הוספת Breakpoint |
ברגע שתראו נקודה אדומה בסמוך לשורה, תדעו שהשורה "סומנה" ובפעם הבאה, רגע לפני שתתבצע השורה, Firebug יעצור ויסמן אותה, תוכלו לגרום לשורה לרוץ שוב על ידי רענון הדף (firebug זוכר שסימנתם את השורה).
Firebug, לחצו על התמונה להגדלה |
פה קורה הקסם. שימו לב שמצד ימין מופיעים כל המשתנים הפעילים וערכיהם בזמן אמיתי, לא רק זה, נוכל גם לעבור עם העכבר מעל המשתנים בחלונית הקוד ולראות את ערכם.
העבודה עם ה debugger מאוד פשוטה (עם מקשי מקלדת):
- F10 - יריץ את השורה ויעצור לפני השורה הבאה
- F11 - במידה והשורה הנוכחית קוראת לפונקציה, F11 יעביר את הסימון לתוך הפונקציה (להבדיל מ F10)
- F8 - ימשיך להריץ את הסקריפט (ללא עצירה בכל שורה) עד ל Breakpoint הבא
- Shift+F11 - יוצא מהפונקציה הנוכחית (במידה ואנחנו נמצאים באחת)
נוכל להשתמש בחלונית ה watch כדי לעקוב אחר ביטויים / משתנים בזמן אמת.
מצד ימין בחלונית המעקב - שימו לב לתיבת טקסט הצהובה:
תיבת ה watch - לחצו עליה כדי להוסיף ביטוי למעקב |
Firebug מציע לנו את כל זה (בחינם!) ועוד יותר. הדרך הכי טובה להכיר את הכלי היא פשוט לשחק איתו. מבטיח שזה ישתלם.