רקע:
לפעמים החיים הם קצת פחות ממושלמים ומתרחשת תקלה שמופיעה למרבה העצבים רק בסביבת הייצור אבל לא בסביבת הפיתוח, תקלה כזו יכולה להיות בעיה של עומס זיכרון בלתי סביר או תקלה של איטיות שלא ברור מקורה, או קריסה של התוכנית ללא כל סיבה הגיונית נראית לעין. המקרים הללו יכולים להיות מאד מתסכלים (בלשון המעטה) ובמיוחד אם אין באמתחתך כלים רציניים לביצוע "ניתוח לאחר המוות לתהליכים" הכלים הללו כוללים אצלי בעיקר את ה-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