DCSIMG
Debugging Multithreaded Code - Liran Chen's Blog

Liran Chen's Blog

.Net Internals, Debugging, Multithreading - and More!

Debugging Multithreaded Code

כל מי שאי פעם ניסה לדבג קוד שרץ תחת כמה ת'רדים בו זמנית, נתקל כנראה בתופעה המציקה שברגע שמבצעים Step Inside וכו', בדיוק כשאתם באמצע הדיבאגינג .. הדיבאגר לוקח אתכם בחזרה 200 שורות קוד לאחור, בפרוייקט אחר בכלל, חותך את חוט המחשבה שלכם בדרך, ובעצם מחזיר אתכם בחזרה ל breakpoint המקורי שהגדרתם. למה? כי פתאום ת'רד אחר בכלל הגיע לאותו ה breakpoint.

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

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

תוכן התגובה

Shlomo כתב/ה:

בעיה באמת מציקה, תודה רבה על הפיתרון

# May 20, 2009 10:47 PM

Rotem Bloom כתב/ה:

תודה אחלה של טיפ

# May 21, 2009 8:48 AM

Noam כתב/ה:

הפתרון היותר נכון הוא לקבוע ב BP תנאי עצירה עבור thread ספציפי. ע"י עצירת כל שאר ה Threads אנחנו מורידים את כל המקרים הבעייתים של משאבים משותפים ונעילות ולכן גם ה Debug נפגע כי אנחנו לא רואים את המצב האמיתי שעלול להיות במערכת

# May 21, 2009 8:57 AM

spiritus asper כתב/ה:

הפתרון הזה תקף רק במקרה שאתה יודע בדיוק עם איזה ת'רד אתה עובד. אם אתה מתזמן משימות דרך Thread Pool כלשהו, אתה לא באמת יודע איזה ת'רד יפעיל אותך ככה שאתה לא יכול לקנפג מראש את ה-BP

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

# May 21, 2009 4:17 PM

Beyond The Spec כתב/ה:

לפני 3 חודשים כתבתי פוסט קצר שהציע דרך להקל על עבודת ה-Debug תחת Multithreaded Environments. במקום להתחיל

# August 29, 2009 10:36 AM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 2 and 7 and type the answer here:


Enter the numbers above: