C:
הדפסת פלט ניפוי שגיאות
איך לעשות:
ב- C, הדרך הנפוצה ביותר להדפיס פלט לניפוי באגים היא באמצעות הפונקציה printf
מתוך ספריית הקלט/פלט הסטנדרטית. הפונקציה printf
מאפשרת פלט מעוצב ליחידת הפלט הסטנדרטית, בדרך כלל המסך. הנה דוגמה פשוטה:
#include <stdio.h>
int main() {
int x = 5;
printf("Debug: The value of x is %d\n", x);
// הלוגיקה של התוכנית כאן
return 0;
}
פלט לדוגמה:
Debug: The value of x is 5
להדפסת ניפוי באגים מתקדמת יותר, ייתכן שתרצו לכלול מידע על שם הקובץ ומספר השורה. ניתן לעשות זאת באמצעות המקרוס המוגדרים מראש __FILE__
ו- __LINE__
כך:
#define DEBUG_PRINT(fmt, args...) fprintf(stderr, "DEBUG: %s:%d: " fmt, __FILE__, __LINE__, ##args)
int main() {
int testValue = 10;
DEBUG_PRINT("The test value is %d\n", testValue);
// הלוגיקה של התוכנית כאן
return 0;
}
פלט לדוגמה:
DEBUG: example.c:6: The test value is 10
שימו לב שבדוגמה זו אנו משתמשים ב-fprintf
לפלט לזרם השגיאה הסטנדרטי (stderr
), אשר לעיתים קרובות מתאים יותר להודעות ניפוי באגים.
צלילה עמוקה
היסטורית, טכניקות ניפוי באגים ב- C היו ידניות ופרימיטיביות, בשל פילוסופיית השפה הקרובה לחומרה וגילה. בעוד ששפות מודרניות עשויות לכלול ספריות ניפוי באגים מתוחכמות מובנות או להסתמך במידה רבה על תכונות של סביבת פיתוח משולבת (IDE), מתכנתי C לעיתים רחוקות מכניסים באופן ידני הודעות הדפסה כאלו הנראות לעיל לעקוב אחר ביצועי התוכנית שלהם.
דבר אחד שיש להיזהר ממנו עם הדפסות ניפוי באגים הוא פוטנציאל שלהם להציף את הפלט ולגרום לבעיות ביצועים, במיוחד אם הם נשארים ללא כוונה בקוד המוצר. מסיבות אלו, שימוש בהידור מותנה (למשל, #ifdef DEBUG ... #endif
) יכולה להיות גישה טובה יותר, מאפשרת לכלול או להוציא הודעות ניפוי באגים בהתבסס על דגלי זמן הידור.
בנוסף, ישנם כלים וספריות מתקדמות יותר זמינים כעת לניפוי באגים ב- C, כגון GDB (GNU Debugger) ו-Valgrind לזיהוי נזילות זיכרון. כלים אלו מציעים גישה משולבת יותר לניפוי באגים, ללא הצורך לשנות קוד על ידי הכנסת הודעות הדפסה.
למרות זאת, הפשטות והמשוב המיידי של ניפוי באגים באמצעות printf
אינם יכולים להיות מופחתים, מה שהופך אותו לכלי שימושי בארגז הכלים של המתכנת, במיוחד לאלו הלומדים את העדינויות של C.