Post Mortem Debugging – כיצד, למה ולמה זה טוב?

Post Mortem Debugging – כיצד, למה ולמה זה טוב?

Print Friendly, PDF & Email

רקע:

לפעמים החיים הם קצת פחות ממושלמים ומתרחשת תקלה שמופיעה למרבה העצבים רק בסביבת הייצור אבל לא בסביבת הפיתוח, תקלה כזו יכולה להיות בעיה של עומס זיכרון בלתי סביר או תקלה של איטיות שלא ברור מקורה, או קריסה של התוכנית ללא כל סיבה הגיונית נראית לעין. המקרים הללו יכולים להיות מאד מתסכלים (בלשון המעטה) ובמיוחד אם אין באמתחתך כלים רציניים לביצוע "ניתוח לאחר המוות לתהליכים" הכלים הללו כוללים אצלי בעיקר את ה-WinDbg ואת ה-DebugDiag (שעליו אולי ארחיב בפעם אחרת). במאמר הזה קיימים הסברים פשוטים כיצד לנתח קובץ Dump כזה למטרות שונות כדי לאתר בקלות יחסית את מקור התופעה. כל מה שרשום במאמר הזה מתייחס, למרבה הצער, לתוכנות מבוססות Dot Net בלבד.

 

קישורים שימושיים:

Steve Johnson SOSEX component: http://www.stevestechspot.com/

Speaking of which… (Great starting point) Getting started with WinDbg Vol.1: http://blogs.msdn.com/b/johan/archive/2007/11/13/getting-started-with-windbg-part-i.aspx

If Broken It Is Fix It You Should (Great blog about post mortem debugging): http://blogs.msdn.com/b/tess/

 

הבסיס:

1. התקנת WinDbg המתאים לסוג המערכת שבה נוצר קובץ ה-Memory Dump שאותו צריך לנתח

2. העתקת קובץ SOS.DLL מתיקיית ה-Dot Net Framework המתאימה לגרסת ה-Framework שבה רצה התוכנית שממנה נלקח קובץ ה-Memory Dump לתיקיה של ה-WinDbg.

3. הפעלת ה-WinDbg ופתיחת קובץ ה-Memory Dump (מתפריט File כקובץ Crash Dump)

4. העלאת רכיבי ה-CLR על ידי הפקודה הבאה: (המיקום זה המיקום שזה מופיע אצלי)

.load d:\windbg\x64\SOS.dll

5. בדיקת תקינות ההעלאה על ידי הפקודה הבאה:

!help

אם קיבלת את הפלט הבא הכל בסדר ואפשר להמשיך:

——————————————————————————-
SOS is a debugger extension DLL designed to aid in the debugging of managed
programs. Functions are listed by category, then roughly in order of
importance. Shortcut names for popular functions are listed in parenthesis.
Type "!help <functionname>" for detailed info on that function. 

Object Inspection                  Examining code and stacks
—————————–      —————————–
DumpObj (do)                       Threads
DumpArray (da)                     CLRStack
DumpStackObjects (dso)             IP2MD
DumpHeap                           U
DumpVC                             DumpStack
GCRoot                             EEStack
ObjSize                            GCInfo
FinalizeQueue                      EHInfo
PrintException (pe)                COMState
TraverseHeap                       BPMD 

Examining CLR data structures      Diagnostic Utilities
—————————–      —————————–
DumpDomain                         VerifyHeap
EEHeap                             DumpLog
Name2EE                            FindAppDomain
SyncBlk                            SaveModule
DumpMT                             GCHandles
DumpClass                          GCHandleLeaks
DumpMD                             VMMap
Token2EE                           VMStat
EEVersion                          ProcInfo 
DumpModule                         StopOnException (soe)
ThreadPool                         MinidumpMode 
DumpAssembly                       
DumpMethodSig                      Other
DumpRuntimeTypes                   —————————–
DumpSig                            FAQ
RCWCleanupList
DumpIL

6. הורדה והעתקה של SOSEX.DLL מהאתר של Steve Johnson עבור ארכיטקטורת מעבד וגרסת דוט נט מתאימה למערכת שבה הורצה התוכנית שממנה נלקח ה-Memory Dump ושמירתו לתיקיה של ה-WinDbg ולאחר מכן טעינתו כך:

.load d:\windbg\x64\SOSex.dll

7. הכנת אינדקס לקובץ ה-Memory Dump על ידי הרצת הפקודה הבאה:

!bhi

8. הפעלת הפקודה הבאה על מנת לאתר את כמות האוביקטים בזיכרון לפי גודל וסוג:

!dumpheap -stat

9. הפעלת הפקודה הבאה על מנת לאתר את האובייקטים הכבדים בזיכרון (ששוכנים ב-LOH):

!dumpheap -min 85000

10. הצגת תוכן ופרטים של אובייקט ספציפי (הכתובת היא לדוגמא בלבד יש לקחת כתובת רלוונטית מהטור השמאלי בפלט של dumpheap):

!do 00000000d4a20820

11. הצגת ה-Threads של המערכת שנדגמה ואת הסטטוס הנוכחי של כל אחד מהם:

!threads

12. הצגת ה-Stack Trace של כל Thread שנדגם:

~*kcn

13. חקירת שגיאות (Exceptions & Bugchecks) שזוהו בקובץ הדאמפ:

!analyze -v

השאר תגובה