Debugging Multithreaded Code
כל מי שאי פעם ניסה לדבג קוד שרץ תחת כמה ת'רדים בו זמנית, נתקל כנראה
בתופעה המציקה שברגע שמבצעים Step Inside וכו', בדיוק כשאתם באמצע
הדיבאגינג .. הדיבאגר לוקח אתכם בחזרה 200 שורות קוד לאחור, בפרוייקט אחר
בכלל, חותך את חוט המחשבה שלכם בדרך, ובעצם מחזיר אתכם בחזרה ל breakpoint
המקורי שהגדרתם. למה? כי פתאום ת'רד אחר בכלל הגיע לאותו ה breakpoint.
הצורה
בה רוב האנשים מתמודדים עם הבעיה, היא דרך כל מיני "משחקים" עם הדיבאגר.
למשל לבטל את ה breakpoint ברגע שנעצרנו בו בפעם הראשונה .. לזכור כמוכן
להחזיר אותו לקראת הריצה הבאה.. ויאדה יאדה.. בקיצור, אנחנו מתעסקים כאן
בעיקר עם כאב ראש מיותר
בסיטואציות כאלה, אני עובד בצורה מעט שונה.
ברגע שאני נכנס ל breakpoint, כל מה שאני עושה זה לגשת לחלון ה Threads, ומסמן את כל הת'רדים הקיימים, מלבד
הת'רד שאני נמצא בו כרגע (מסומן ע"י החץ הצהוב). לאחר מכן כל מה שנשאר הוא
להקליק על הלחצן הימני ולהעביר את כל הת'רדים הנבחרים למצב Freeze.
וסיימנו.
כעת, ניתן להמשיך לדבג את התוכנית כאילו היינו מדבגים ת'רד
אחד בלבד. היתרון הנוסף הוא שאנחנו יודעים שאף אחד מהת'רדים האחרים לא
עובד בזמן שאנחנו מדבגים, כך שאין לנו מה לדאוג שעצם זה שאנחנו מבזבזים
זמן בלדבג קוד, שאר החלקים בתוכנית ישפעו מכך (או לפחות מצמצמים את ההשפעה
במידה ועובדים מול מספר תהליכים נפרדים).
הדבר היחיד שצריך לזכור, הוא
לפני שמסיימים לדבג ורוצים להמשיך להריץ את התוכנית (ע"ע F5), אנחנו
צריכים לזכור להעיר את כל הת'רדים. נעשה זאת בדיוק כמו שהקפאנו אותם, רק
שבמקום Freeze נקליק על Thaw. כעת, ניתן ללחוץ על F5 ולהמשיך בריצה כרגיל.