**מנפה שגיאות**, או דבאגר (מאנגלית: Debugger), היא תוכנת מחשב, שלרוב משמשת מתכנתים למציאת שגיאות במהלך פיתוח ותחזוקה של תוכנות מחשב אחרות. לרוב תוכנות מחשב פועלות ולא ניתן לדעת אם הייתה שגיאה או לא אלא אם כן התוכנית החזירה פלט כלשהו למשתמש, או שהתוכנית החזירה שגיאה, ולרוב פלט זה יחזור רק בסוף ריצת התוכנית, מה שבתוכניות מורכבות עלול לקחת זמן רב. הדרך העיקרית שבה הדבאגר מאפשר למתכנת למצוא את מקור השגיאות היא באמצעות הכוח לעצור ריצת תוכנית באמצע, ולבדוק את תמונת הזיכרון של התהליך בנקודה זו.

היסטוריה
--------

באג המחשב הראשון בהיסטוריה
### מקור השם

לשגיאה בתוכנה נהוג לקרוא באג (חרק, באנגלית: Bug). יש עדויות לשימוש במונח זה עוד בשנת 1878, במכתב ששלח תומאס אדיסון לשותף שלו, בו הוא מתאר כי נותרו לו מעט בעיות (באגים) לפתור בפיתוח שלו, אך המונח נטבע רשמית על ידי גרייס הופר בשנת 1952, בזמן שעבדה על הרווארד סימן 2, והתגלה עש בתוך המכונה שגרם לבעיות בתפקוד שלה. לאחר שהוציאו את החרק מתוך המכונה, הוא הודבק ליומן מעקב של המכונה (כפי שניתן לראות בתמונה), והתפשטה השמועה כי המפתחים דיבגו (debugged) את המכונה, וכך נטבע המונח.

### לפני המצאת הדבאגר

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

יכולות מרכזיות
--------------

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

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

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

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

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

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

### תלות בשפת הפיתוח

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

מנפי שגיאות נפוצים
------------------

הנה מספר דוגמאות למנפי שגיאות נפוצים:

1. דבאגר ה-javascript של פיירפוקס או של גוגל כרום
2. GDB
3. LLDB
4. הדבאגר של Eclipse

ראו גם
------

* סביבת פיתוח משולבת

קישורים חיצוניים
----------------

1. Moth in the machine: Debugging the origins of 'bug'

הערות שוליים
------------

1. ↑  היסטוריה של באגים ודיבאגר

| תחומים במדעי המחשב |
| --- |
| יסודות מתמטים | לוגיקה מתמטית • תורת הקבוצות • תורת המספרים • תורת הגרפים • תורת הטיפוסים • תורת הקטגוריות • אנליזה נומרית • תורת האינפורמציה |
| תורת החישוביות | תורת האוטומטים • תורת הרקורסיה • תורת הסיבוכיות • מחשוב קוונטי |
| אלגוריתמים ומבנה נתונים | אנליזה של אלגוריתמים • גאומטריה חישובית |
| שפות תכנות ומהדרים | מפרש • פרדיגמת תכנות (תכנות פרוצדורלי • תכנות מונחה עצמים • תכנות פונקציונלי • תכנות לוגי) |
| חישוב מבוזר ועיבוד מקבילי | עיבוד מקבילי • מחשוב סריגי • בקרת מקביליות |
| הנדסת תוכנה | ניתוח מערכות מידע • עיצוב תוכנה • תכנות מחשבים • שיטות פורמליות • בדיקות תוכנה • מתודולוגיית פיתוח תוכנה |
| תקשורת | ניתוב • טופולוגיית רשת • קריפטוגרפיה |
| מסד נתונים | מסד נתונים יחסי • SQL • תנועה • אינדקסים • כריית מידע • CAP theorem |
| בינה מלאכותית | חשיבה אוטומטית • בלשנות חישובית • ראייה ממוחשבת • עיבוד שפה טבעית • בינה חישובית • מערכת מומחה • למידה חישובית • רובוטיקה |
| גרפיקה | הדמיה ממוחשבת • הנפשה ממוחשבת • עיבוד תמונה |
| שפות פורמליות | שפה רגולרית • שפה חסרת הקשר • שפה תלוית הקשר • ההיררכיה של חומסקי |
| שימושים במדע | ביואינפורמטיקה • מדעים קוגניטיביים • כימיה חישובית • פיזיקה חישובית • אנליזה נומרית |