משהו מוזר...

the another one

New member
משהו מוזר...

כתבתי תוכנית ב ++C. בסדר, לקחתי פוינטר (שלא עשיתי לו new) והתחלתי לעשות עליו פעולות. הרצתי ב debug mode - והוא רץ בלי בעיות. אבל כשהרצתי ב release mode - בום
! הוא נפל... למישהו יש מושג מה קורה כאן ? הגיוני שב debug mode יתירו דברים שאסורים ב release ???
 

spurpur

New member
מזל טוב

נחשפת לאחת העובדות היותר כואבות של C ו C++ תגיד תודה שזה קרה "בזמן ששיחקת" ולא בזמן שדיבגת פרוייקט של 10000 שורות קוד. אכן, יש שוני. במוד debug הקומפיילר "עוטף" אזורי זכרון בזכרון מוקצה נוסף, כדי שיהיה קל יותר לדבג ולעלות על בעיות (תקרא קצת ב help של ה debugger - מאוד מועיל).
 

annefan

New member
סליחה?

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

the another one

New member
אני יכול להיות אבא שלך !

אם היה לך קצת ניסיון בתכנות היית מבין שזה לא מאד נוח שהתוכנית עובדת טוב במצב DUBUG אבל נופלת ב RELEASE ! אם היה לך קצת ניסיון ב DEBUGGER של ה visual c++ , היית יודע שכשאתה מדבג ב RELEASE MODE אתה רואה את האסמבלי. היית מקבל תגובה יותר נחמדה, אם התגובה שלך הייתה קצת פחות מתנשאת.
 

vinney

Well-known member
אבא'לה

שים ASSERTים על המצביעים פעם הבאה, הוא צודק בהערה שלו.
 

the another one

New member
באותה מידה אני יכול

להוסיף cout-ים ו if-ים. מה זה עוזר לי ? ה DEBUGGER עדיין יסתיר ממני שגיאות.
 

vinney

Well-known member
היי, הוא שוב צודק...

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

annefan

New member
ככה

א. אתה לא יכול להיות אבא שלי. אתה אולי יכול לרצות להיות אבא שלי, אבל לא להיות אבא שלי. ב. אני לא הולך להמשיך את הדיון ברמה של "אם היה לך קצת נסיון בתכנות", "לא, אם _לך_ היה קצת נסיון בתכנות", "לא, אם _לך_ היה קצת נסיון בתכנות". ג. מה הקשר בין השאלה שלך לבין זה שב-release רואים אסמבלי?? אני מדבר על החלון שמציג את הזכרון. ד. אגב, מומלץ בחום רב, עד כדי לוהט, ליצור debug information, גם ב-release בודאי בשלבי הפיתוח. ה. יש הרבה מאוד תוכניות שעובדות ב-debug ולא עובדות ב-release (בעיות "טריוויאליות", כמו threads, timing, race-conditions ועוד צרות).
 

the another one

New member
ככה ככה :

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

DadleFish

New member
ה-DEBUGGER לא מסתיר ממך

שום דבר. קוד המקור של התוכנית שלך משתנה בדרך להיותו קוד שפת מכונה. הקומפיילר מתבסס על אוסף חוקים והופך את הקוד שלך לקובץ שאפשר להריץ. כשאתה רץ תחת הקונפיגורציה של DEBUG, אוסף החוקים שונה מזה של ה-RELEASE, ולכן התוצאה שונה. תריץ את הקוד הבא ב-DEBUG וב-RELEASE ותראה:
#include <iostream> using namespace std; int main(int argc, char* argv[]) { bool b; cout << ((b)?"true":"false") << endl; return 0; }​
בכל אופן, כל מה שהקומפיילר עושה בשיטת ה-DEBUG נועד לעזור לך לדבג את התוכנה שלך. זה שאתה לא יודע מה הוא עושה, איך הוא עושה, ולמה הוא עושה, זה כבר בעיה של חוסר ידע מצידך. ישנם ספרים מצוינים על דיבוג אפליקציות תחת WINDOWS, ספציפית ל-VISUAL STUDIO. ממליץ לך לקרוא.
 

galh

New member
אבא צעיר? אתה לא עתודאי? ../images/Emo3.gif

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

the another one

New member
אתה מנסה להסביר לי

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

galh

New member
מנסה? אני רוצה להצליח להסביר. ../images/Emo13.gif

ליתר דיוק, הקומפיילר לא מוסיף לך את הקוד הזה. מי שמוסיף אותו זו ספריית ה- Run time של C. זה שירות שניתן לך כדי לעזור לך, כמתכנת, לתפוס שגיאות זכרון כגון דריסת זכרון, שימוש בזכרון אחרי שחרור, אי שחרור זכרון ועוד. אתה יכול לותר על השירות הזה אם תגדיר NDEBUG (דרך קובץ או דרך הגדרות הפרוייקט). במקום לקנות תוכנה כמו Bounds Checker בכמה אלפי דולרים אתה מקבל שירות דומה בעלות שכלולה בקומפלייר. תנסה להוסיף את השורה:
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);​
מייד אחרי ה- main שלך (צריך לעשות include לקובץ crtdbg.h). תקצה כמה משתנים בלי לשחרר ותראה את הפלט ב- Output window. לגבי הוספת קוד אוטומטית, אתה טועה. הגישה היום בשפות "המודרניות" היא דווקא להוריד מהמתכנת את הנושא של ניהול זכרון. תראה שפות כמו VB או $C או JAVA ואפילו ++Managed C של NET$. כל השפות האלו מורידות לך את הכאב ראש של ניהול זכרון. פיתוח בכל שפה כזו הוא הרבה יותר מהיר. בשביל לראות ולדבג קוד בגרסת Release לך להגדרות הפרוייקט, בטאב של ++C בקטגוריה של General ותבחר ב- Program Database בחלק של ה- Debug Info. אחר כך תוסיף X בטאב של ב- Link בכפתור של Generate Debug Info. אחרי קיפלול תוכל לראות את הקוד. שים לב שלפעמים, בגלל האופטימיזציות, הריצה של הקוד תראה קצת "קופצנית" לפעמים או שלא תוכל לראות ערכים של משתנים זמניים. לסיום, אני חושב שהגישה שלו נגרמה בגלל הגישה שלך, אבל לא נתחיל לחפש אשמים. שניכם צריכים להתחיל להתנהג יפה מעכשיו.
 

the another one

New member
התוספות האלה בעצם מעלימות לי

שגיאות ! אם אני אתעלם מהן, הן ייעלמו ? הלוואי שזה היה ככה גם בחיים !
 

DecayCell

New member
הן לא מעלימות שגיאות

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