äŒè°ã§ã®ã¬ããŒãã«é¢ããäžé£ã®åºçç©ãç¶ããŠãæé«ã®ã¬ããŒãDotNext 2016 Moscowãæ±ºå®ããŸããããã®ã¬ããŒãã§ã¯ãSasha
goldshtn Goldsteinã.NETã¢ããªã±ãŒã·ã§ã³ããããã°ããããã®WinDbgã®æ©èœã«ã€ããŠèªã£ãŠããŸãã ãã®éåžžã«åŒ·åãªããŒã«ã䜿çšãããšãçµã¿èŸŒã¿ã®Visual Studioãããã¬ãŒã§ã¯åŠçã§ããªãåé¡ã解決ã§ããŸãã
ãã®è³æã¯ãè§£èªããã°ããã匷åãªãã®ã«ç¿»èš³ãããŠãããããè±èªã§ã¬ããŒããèŠãã®ãé£ãããšæãã人ã«ç¹ã«åœ¹ç«ã¡ãŸãïŒ
Windbgã¯ãããŒãã³ã¢ã®C ++éçºè
ã®ã¿ã䜿çšã§ããéåžžã«è€éãªããŒã«ãšèŠãªãããŸãã ãã ãããã®ã¬ããŒãã§ã¯ãã©ã®ãããªå Žåã«.NETéçºè
ã«åœ¹ç«ã€ããWinDbgã䜿çšããŠ.NETã¢ããªã±ãŒã·ã§ã³ããããã°ããæ¬åœã«è€éãªåé¡ã解決ã§ããå Žåã瀺ããŸãã
æ¢ã«WinDbgã䜿çšããŠãã人ãããŸããããã®ã¬ããŒãããäœãæ°ããããšãåŠã¹ãããšãé¡ã£ãŠããŸãã ãããŠããŸã WinDbgã«åºäŒã£ãŠããªã人ã®ããã«ããã®ããŒã«ãããªãã«äœãããããšãã§ããã®ãããèŠãããããšæããŸãã
- WinDbgã䜿ããããããããã®ãã³ãããå§ããŸããWinDbgã¯ã.NETéçºè
ã«ãšã£ãŠå°ãç°¡åã§ãã
- ã¹ã¯ãªãããšãã¬ãŒã¯ãã€ã³ãïŒãã¬ãŒã¯ãã€ã³ãïŒã®åã«ã€ããŠã話ããŸãããããã¯å€ãã®å Žåãåé¡ã解決ããã®ã«åœ¹ç«ã¡ãŸãããã以å€ã®å Žåãç¹ã«Windowsã§ã¯è§£æ±ºã§ããªããšæããŸãã
- 䟿å©ãªæ¡åŒµæ©èœã«ã€ããŠèª¬æããŸãã WinDbgã«ã¯åªããæ¡åŒµã¢ãã«ããããŸããä»»æã®ã³ãŒããå®è¡ããã¢ããªã³ãããŠã³ããŒãããŠããããã¬ãŒèªäœã§ã¯åŠçã§ããªããã®ãèŠã€ããããšãã§ããŸãã
- WinDbgã§ã¯ãã®ã¹ã¯ãªãããéåžžã«åçŽãªã®ã§ããªã¢ãŒããããã°ã«ã€ããŠå°ã話ããŸãããã
ç§ãã¡ã®ã»ãšãã©ãæ¯æ¥äœ¿çšããVisual Studioãããã¬ãŒã¯ããããã玹ä»ããè³æã®çŽ90ïŒ
ã«å¯Ÿå¿ããŸããã ã ãããããWinDbgã䜿çšããŠãã®ãã¹ãŠã玹ä»ããŠããŸãïŒããã¯éåžžã«æ¥œããããŒã«ãªã®ã§ãŸã£ãã衚瀺ãããŸããïŒã Visual Studioã«ã¯ãªããã¯ãŒããããŸãã
Visual Studioã§ããŸããããªããšã
Visual Studioã¯åŒ·åãªãããã¬ãŒãšåŒã°ããŸããïŒ
åœŒã¯æªããªãã ããããããã¯ããŠã¹ããããããŒã䜿çšããã人ã®ããã®ããã¡ãã§ãã IDEAãDDDããŸãã¯WinDbgãåããJDBã®ãããªæ¬åœã«åŒ·åãªãããã¬ãšæ¯èŒãããšãVisual Studioã¯äžçš®ã®ããã¡ãã§ãã Visual Studio 2012ã®ããã«ãã¯ãããªããªã£ããããç¬èªã®ã¹ã¯ãªããã§ãããã¬ãŒãæ¡åŒµããããšã¯éåžžã«å°é£ã§ãã ãããã¬ãŒã¡ã«ããºã èªäœã«ã¯å®è³ªçã«æ¡åŒµæ©èœã¯ãããŸããã ãŸãããœãŒã¹ã³ãŒããããã°Visual StudioãåªããŠããŸãã ããããç¹å®ã®ãã®ã®ãœãŒã¹ã³ãŒãããªãå Žåãäœããããã®ã¯ã¯ããã«å°é£ã«ãªããŸãã ã»ãšãã©äœãã§ããŸããã
ãããã£ãŠãç§ã¯Visual Studioã奜ãã§ããããã匷åãªããŒã«ãå¿
èŠãªå Žåãããã€ããããŸãã
ããããããªãã®äœäººãã¯ãLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã®ãšãã£ã·ã§ã³ã®
Redditã§
ãã®å³ã®
å
ãèŠãããšããããŸãã

ããã§ãVisual Studioã¯æãçãã²ãã§ãã å®éã®ãªã¿ã¯ã¯ãWinDbgã®ã³ã³ãœãŒã«ããŒãžã§ã³ã§ããWinDbgãcdbãªã©ã䜿çšããŸãã èšãæããã°ãåŠã¶ã¹ãããŒãã³ã¢ããã€ã§ãèŠã€ããããšãã§ããŸãã
ããã§ã¯ãæåã«WinDbgãå°ã䜿ããããããããã€ãã®ããšãèŠãŠã¿ãŸãããã
WinDbgã®æãã軜æž
ã€ã³ã¿ã©ã¯ãã£ãã¡ãã¥ãŒ
WinDbgãéåžžã«æãã®ã¯ãèšå€§ãªæ°ã®ã³ãã³ããèŠããŠããå¿
èŠãããããã§ãã ããã«ã¯ããã€ãã®ã¡ãã¥ãŒãšã·ã§ãŒãã«ããããããŸãããå€ãã®å Žåãå€ãã®ããã¹ãã³ãã³ããæåã§å
¥åããå¿
èŠããããŸãã
ãã ããWinDbgã«ã¯ããã®çŽ æµãªã¡ãã¥ãŒãäœæãã
.cmdtree
ã³ãã³ãããããŸãã

ããŠã¹ã䜿çšããŠã¡ãã¥ãŒå
ãç§»åãã䟿å©ãªã³ãã³ããèµ·åã§ããŸãã
ç§ã®ãªããžããªã®1ã€ã«ã¯ãã«ããŽãªã«ã°ã«ãŒãåããã䟿å©ãªã³ãã³ãã®ã€ã³ã¿ã©ã¯ãã£ãããªãŒã®ãµã³ãã«ãã¡ã€ã«ããããŸãã ãã®ã¡ãã¥ãŒã«ãããåå¿è
ã«ãšã£ãŠWinDbgãå°ãç°¡åã«ãªããŸãã
åºåå
ã®ãªã³ã¯
ã³ãã³ãã®åºåããšãŠãæãã®ã§ãå€ãã®äººãWinDbgã奜ãã§ã¯ãªããšæããŸãã ãããŠãã»ãšãã©ã®å Žåãã³ããŒãšè²Œãä»ãã䜿çšããå¿
èŠããããŸããããã³ãã³ãã®çµæãååŸããŠãå¥ã®ã³ãã³ãã«æž¡ããŸãã
æ°ã«å
¥ããªã人ã®ããã«ãWinDbgããŒãžã§ã³ã§ã¯DMLãšããååã§é·ãéããã©ã«ãã§æå¹ã«ãªã£ãŠãããªãã·ã§ã³ããããŸãïŒDMLã¯ãããã¬ãŒããŒã¯ã¢ããèšèªã§ããåŸã§äŸã瀺ããŸãïŒã ãã®ãªãã·ã§ã³ã®ãããã§ããããã¬ãŒã®ææ°ããŒãžã§ã³ã§ã¯ãã³ãã³ãã®åºåã«ãªã³ã¯ããããŸãã ä»ã®äœããååŸããã«ã¯ããªã³ã¯ãã¯ãªãã¯ããã ãã§ãã
次ã®äŸã§ã¯ã
!name2ee
ãšããã³ãã³ããå®è¡ããŸããããã®ã³ãã³ãã¯ã¯ã©ã¹åïŒãã®äŸã§ã¯CïŒã¯ã©ã¹ïŒãååŸããã¯ã©ã¹ã«é¢ããæ
å ±ïŒç¹ã«ãã¢ã»ã³ããªã®å ŽæïŒãæäŸããŸãã

ã³ãã³ãã®åºåã«ã¯ãã¯ãªãã¯ã§ãããªã³ã¯ããããŸãã ããšãã°ãEEClassãã£ãŒã«ãã®æšªã®ãªã³ã¯ãã¯ãªãã¯ãããšã次ã®ããã«ãªããŸãã

ãªã³ã¯ã¯ãã¿ã€ãæ
å ±ã衚瀺ããå¥ã®ã³ãã³ããèµ·åããŸãã ã¹ã¯ãªãŒã³ã·ã§ããã®äžéšã«ããããã«ããã£ãŒã«ããã¿ã€ããããã³ãã®ãã£ãŒã«ãã«é¢ããè¿œå æ
å ±ããããŸãã ãŸãããªã³ã¯ããããŸãã ããããã¯ãªãã¯ãããšãè¿œå æ
å ±ãªã©ãåŸãããŸãã ãã¹ãŠã®ããŒã ãèŠããŠããªãå Žåããã®ããŒã«ããããããã°ãããŒã ã®çµæã調æ»ããã®ããã䟿å©ã§ãã
èªåå
WinDbgãæãããããã1ã€ã®æ©èœã¯ãåçŽãªãã®ã®äžã«ã¯å€§éã®ããã¹ãå
¥åãå¿
èŠãªãã®ãããããšã§ãã ããããå€ãã®äººãç¥ããªããã1ã€ã®äŸ¿å©ãªç¹ããããŸããWinDbgãèµ·åããè€æ°ã®ã³ãã³ããäžåºŠã«å®è¡ããæåŸã«çµäºããããšãã§ããŸãïŒåŸã§ããã€ãäŸã瀺ããŸãïŒã åºæ¬çã«ãWinDbgã«ã¯-cã¹ã€ããããããã³ãã³ãã©ã€ã³ãåãå
¥ããŸãã
倱æããããã»ã¹ã®ãã³ããã¡ã€ã«ã®äŸã䜿çšããŠããã®æ©èœãã©ã€ãã§ãã¢ããæ¹ãç°¡åã§ãã
ãã©ã«ãCïŒ\ tempã«ãããã€ãã®ãã³ããã¡ã€ã«ãä¿åããŸããã WinDbgãšcdbããããŸã-åè¿°ã®ããã«ãããã¯WinDbgã®ã³ã³ãœãŒã«ããŒãžã§ã³ã§ãã WinDbgïŒcdbïŒã䜿çšããŠãã³ããã¡ã€ã«ã®1ã€ãéããŸãã
cdb.exe -z C:\temp\FileExplorer.exe.14804.dmp -c ".logopen C:\temp\crash.log; !analyze -v; .logclose; q"
-z
ãã³ãçšã«åãæ¿ããŸãã
-c
ãã³ããéããçŽåŸã«ã³ãã³ããå®è¡ã§ããŸãã
äž»ãªããšã¯ããã¡ã€ã«ãéããŠæåŸã«çµäºããããšãå¿ããªãããšã§ãã
".logopen C:\temp\crash.log; !analyze -v; .logclose; q"
-ãã®ã³ãã³ãã©ã€ã³ã¯ãã³ããã¡ã€ã«ãåæããæçšãªæ
å ±ãæäŸããŸãã
.logopen
ã¯ãåºåãå®è¡ããããã°ãã¡ã€ã«ãéããŸãïŒãã¡ã€ã«å
ã®è¡ãæ€çŽ¢ããŠåŸã§åæã§ããããããã°ãã¡ã€ã«ã®æ¹ã䜿ããããã§ãïŒã
ããã«ã¯ããããã¬ãŒã®åºæ¬çãªèªååããããŸãããããã¬ãŒãéå§ãããã³ããã¡ã€ã«ãåæããããããã¹ãŠããã°ãã¡ã€ã«ã«å
¥ããŠçµäºã§ããŸãã ãããŠããããã®ã¢ã¯ã·ã§ã³ã¯ç¹°ãè¿ãå¯èœã§ã-ãããã¢ãŒãã§å®è¡ã§ããŸãã
ãã®çµæããã³ãã§äœãèµ·ãã£ããã«ã€ããŠã®æ
å ±ãååŸããŸãã åºåã®æåŸã«ã¯ãå®è¡ã«é¢ããæ
å ±ãåŒã³åºãã¹ã¿ãã¯ããã®ä»ã®æçšãªè©³çްãå«ãŸããŠããŸãã
å¥ã®äŸã ããã§ã¯ãåºåçµæã§
findstr
ãå®è¡ããŠãã¯ã©ãã·ã¥ããããã»ã¹ã®ååãšãäŸå€ãšåŒã°ãã颿°ãèŠã€ããŸããã

ãŸãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãCLRããŒãžã§ã³ã«é¢ããæ
å ±ããããŸã-äžè¬ã«ãå€ãã®æçšãªãã®ã§ãã
ç¹°ãè¿ããŸãããäŸã¯ãã¡ã¢ãªãªãŒã¯ã®æ€çŽ¢ã§ãã䜿çšããã¡ãœããã§ãã ã¡ã¢ãªãªãŒã¯ãçºçãããšãããã»ã¹ãã©ãã©ã倧ãããªã£ãŠããããšãããããŸãã ãããŠã宿çã«æ¥ç¶ããŠããåæããå¿
èŠããããŸãã WinDbgã䜿çšããŠè¡ãæ¹æ³ã次ã«ç€ºããŸãã

ã¡ã¢ãªãªãŒã¯ãçºçããå¯èœæ§ã®ããããã»ã¹ïŒåå ãããïŒã«å¯ŸããŠ
-pn
ã
-pn
ããŠcdbãå®è¡ããŸãïŒãã®æ¹ã奜ããªã®ã§ïŒã 次ã«ã.NETããŒããªããžã§ã¯ãã®çµ±èšæ
å ±ã衚瀺ãã
!dumpheap
ãæå®ããŸãã
-min
ã¯ããã®å Žåã10,000ãã€ããè¶
ãããªããžã§ã¯ãã®ã¿ãå¿
èŠã§ãã
-min
æå³ããŸãã æåŸã«ã
qd
ã䜿çšããŠ
qd
çµäºããŠåæããŸãã
ãã®ã³ãã³ãã®å®è¡åŸãWinDbgã¯ããã»ã¹ã«æ¥ç¶ãã10,000ãã€ããè¶
ããããŒãå
ã®äžäœãªããžã§ã¯ãã衚瀺ããããã»ã¹ããåæããŸãã èšãæããã°ãããã¯ãã¡ã¢ãªã«äœãèµ·ããããèŠã€ããããã®ã»ãŒç¬æã®æ¹æ³ã§ãã åãããšããããã¢ãŒãã§å®è¡ã§ããŸãã Visual Studioã§äŒŒããããªããšãããã人ã«å¹žéãã

ã¹ã¯ãªããèšèªWinDbg
äžèšã®èªååã®äŸãã匷åãªãããã¬ãŒãããå Žåã«èªåã¢ãŒãã§å®è¡ããã¹ã¯ãªãããäœæããŠç¹°ãè¿ã䜿çšã§ããããšã蚌æããããšãé¡ã£ãŠããŸãã ããããåå©çšã®å©ç¹ãå®éã«æŽ»çšããã«ã¯ãã¹ã¯ãªããèšèªã®ä»çµã¿ãçè§£ããå¿
èŠããããŸããããã¯ãWinDbgã®æãè€éã§ãã²ã©ããéšåã§ãã
WinDbgã«ã¯ã¹ã¯ãªããèšèªãçµã¿èŸŒãŸããŠããŸããããã®èšèªã¯æå³çã«éçºãããããšã¯ãããŸããã CïŒãšã¯ç°ãªãããã®èšèšã¯å¥ã®å§å¡äŒã«ãã£ãŠç®¡çãããŠããŸãã ããã¯åŸã
ã«ç»å Žããèšèªã§ããã誰ããäœãã远å ããä»ã®èª°ãããããä¿®æ£ããŸããã ç§ãã¡ãæã£ãŠããããšãèµ·ãã£ãã
ãã®ã¹ã¯ãªãããèŠãŠã¿ãŸãããïŒããã«å€ãã®äŸããããé¢é£ãããã¥ãŒããªã¢ã«ããããŸããããã®äŒè©±ãWinDbgã®ã¹ã¯ãªãããã¥ãŒããªã¢ã«ã«å€ããŸããïŒã

ããã§ãæåã®è¡ã¯å€æ°
$t0
ãå€
0
ã§åæåããŸãã ç°¡åã§ãã 2è¡ç®ã¯ãç¹å®ã®é¢æ°ã«ãã¬ãŒã¯ãã€ã³ããé
眮ããŸãã
NtAllocateVirtualMemory
颿°ã¯ãã¡ã¢ãªãå²ãåœãŠãWindows APIã§ãã ãã¹ãŠã®ã¡ã¢ãªå²ãåœãŠã¯ãäœããã®æ¹æ³ã§ãã®APIã䜿çšããå¿
èŠããããŸãã
ãã¬ãŒã¯ãã€ã³ãã«å°éãããã³ã«ïŒãã®é¢æ°ãåŒã³åºããšãïŒãåŒçšç¬Šå
ã§ã³ãã³ããå®è¡ããŸãïŒäœããã®æãããåŒã§å€æ°
$t0
ãå¢ãããŸãïŒããã§ã
rdx
倿°ã«ã¯å²ãåœãŠãããã¡ã¢ãªã®éãå«ãŸããŠããŸãïŒã
次ã«ãã¢ããªã±ãŒã·ã§ã³ãå®è¡ãç¶ããããã«
g
ãå
¥åããŸããã ãã®åŸã
.printf
ã³ãã³ãã䜿çšããŠå€æ°
$t0
çŸåšã®å€ãåºåããŸããããã«ãããå²ãåœãŠãããä»®æ³ã¡ã¢ãªã®åèšéã
.printf
ãŸãã
ã€ãŸãããã¬ãŒã¯ãã€ã³ããèšå®ããŸãã åãã¬ãŒã¯ãã€ã³ãã¯ãå²ãåœãŠããããã€ãæ°ã ã倿°ãå¢ãããŸãã å¿
èŠã«ãªã£ããããã®å€æ°ã®å€ãåºåããŠãå²ãåœãŠãããã¡ã¢ãªéã«é¢ããæ
å ±ãååŸããŸãã
ãã¬ãŒã¯ãã€ã³ã
ã©ããã«ãã¬ãŒã¯ãã€ã³ããèšå®ããããªãã®ããã«äœãããããšããäžè¬çãªã¢ãããŒãã¯éåžžã«å¹æçã§ãã Visual Studioã§ã¯ãå€ãã®å Žåããã¬ãŒã¯ãã€ã³ãã䜿çšããŠãããã¬ãŒãåçŽã«åæ¢ããŸãã ããã¯çŽ æŽããããç§ãããã ãããããã¬ãŒã¯ãã€ã³ãã®æ¬åœã®åŒ·ã¿ã¯ããããããªãã®ããã«åãããšãã§ãããšããããšã§ãïŒããªãã®ããã«ããªãã®ããã«ã§ã¯ãªãïŒã
以äžã«ããã®äŸãããã€ã瀺ããŸãã
ãã¡ã€ã«ãäœæããã¢ããªã±ãŒã·ã§ã³ããããããããã®ãã¡ã€ã«ãã©ãããæ¥ãã®ãããããªããšããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯åŒãç¶ããã¡ã€ã«ãäœæããŸãããããããåé€ããã«ãããã¯ããŸãã ãããã£ãŠãã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã¯ããããã®ãã¡ã€ã«ãåé€ã§ããŸããã 確ãã«å€ãã®äººãåæ§ã®ç¶æ³ã«çŽé¢ããŠããŸããã
ãããã®ãã¡ã€ã«ãã©ãããæ¥ãã®ããç¥ããããšããŸãã ãããè¡ãã«ã¯ããã€ãã®æ¹æ³ããããŸãã æãç°¡åãªã®ã¯ããã¬ãŒã¯ãã€ã³ãã远å ããããšã§ãã ãã¡ã€ã«ãäœæããå Žæã«ãã¬ãŒã¯ãã€ã³ããé
眮ããŠããã¡ã€ã«ã®åºæã確èªããŸãããã

Windows APIã«ã¯ããã¡ã€ã«ãéãããã®2ã€ã®äž»èŠãªé¢æ°
CreateFileW
ãš
CreateFileA
ãŸãã
ãããã®é¢æ°ã®ãããããåŒã³åºããã³ã«ãéããã¡ã€ã«ã®ååãåºåããŸãã
ããã§ã
@esp+4
ã¯32ãããããã»ã¹ïŒx86ïŒã®ã¹ã¿ãã¯ãã€ã³ã¿ãŒã§ããã
@esp+4
ã¯é¢æ°ã®æåã®ãã©ã¡ãŒã¿ãŒã§ãïŒããã¯èŠããŠããå¿
èŠã¯ãããŸãããããã¯ããããã¬ãŒã§ç¢ºèªã§ããŸãïŒã
CreateFileW
ãåŒã³åºãå Žåããã¡ã€ã«åã¯Unicodeæååã§ããããã
%mu
圢åŒã䜿çšããŸã
CreateFileA
å Žåããã¡ã€ã«åã¯ANSIæååã§ããã
%ma
ã䜿çšããŸãã
次ã«ããã¡ã€ã«åãš3ã€ã®ããã·ã¥ãå°å·ããŸãã
k
ã³ãã³ãã¯ãã³ãŒã«ã¹ã¿ãã¯ã衚瀺ããŸãã ãã®çµæãã¢ããªã±ãŒã·ã§ã³ããã¡ã€ã«ãéããã³ã«ãã©ã®ãã¡ã€ã«ãéããã«ã€ããŠã®ã¡ãã»ãŒãžããããã¬ãŒã«è¡šç€ºãããŸãïŒåŒã³åºãã¹ã¿ãã¯ã¯ãããã«å°éããæ¹æ³ã瀺ããŸãïŒã äžèšã®äŸã¯C ++åŒã³åºãã¹ã¿ãã¯ã§ããã.NETã¢ããªã±ãŒã·ã§ã³ã§ãåãããšãã§ããŸãã ããã«ããã€ãã®äŸãèããŠã¿ãŸãããã
ç§ã®ã¢ããªã±ãŒã·ã§ã³ããã¡ã€ã«ã®æ¬ èœã«ã€ããŠäžå¹³ãèšã£ãŠãããšããŸã-ããã€ãã®ãã¡ã€ã«ãéãããšãã§ããŸããã ãããããã®çç±ãšå Žæãæ£ç¢ºã«æããŠãããŸããã ããã¡ã€ã«ãéããŸããããªã©ã®æããªãšã©ãŒã¡ãã»ãŒãžã®ã¿ã衚瀺ãããŸãã ããã¯é »ç¹ã«èµ·ãããŸãã
å°ãè€éã§ããããã¬ãŒã¯ãã€ã³ããèšå®ããã ãã§ãã ãšã©ãŒãçºçããããšãããããŸãïŒãã¡ã€ã«ãéãããšãã§ããŸããã§ããïŒã ãããè¡ãã«ã¯ã
CreateFileW
ïŒä»¥äžã®äŸã§ã¯ãå°ããªãšã©ãŒïŒãªãã»ãã
0x61
ã¯ååšããªãã¯ãã§ããç¡èŠããŠãã ããïŒã

ããã§ããã¬ãŒã¯ãã€ã³ãã
CreateFileW
ã«é
眮ããŸãã
gu
ã³ãã³ãã¯ããã®é¢æ°ããæ»ãåã«å®è¡ãããŸãã 忢åŸã
@eax
ã¬ãžã¹ã¿ã確èªããŸãã 32ãããWindowsã§ã¯ã
@eax
ã¯é¢æ°ã®çµæãä¿åããŸãã 64ãããWindowsã§ã¯ã
@rax
ã¯æ¬è³ªçã«åãè² è·ãéã³ãŸãã æ»ãå€ããŒãã®å Žåããã¡ã€ã«ãäœæã§ããŸããã§ããã ãããã¬ãŒãåŒã³åºããæ©èœããªãã£ãããšã確èªããå Žåãéãããšãã§ããªãã£ããã¡ã€ã«ãå°å·ããŸãïŒãããŠãåã³åŒã³åºããçºçããå Žæã§åŒã³åºãã¹ã¿ãã¯ãå°å·ã§ããŸãïŒã
ç¹°ãè¿ããŸããããããã¬ã¯ç§ã®ããã«æ©èœããŸããããã®éã¯æ©èœããŸããã ãã¡ã€ã«ãéãããšãã§ãããã¹ãŠã®å Žæãã³ãŒãã§èŠã€ããããšã¯ããŠããŸããã ãããã¬ãŒã«æ¬¡ã®ããã«äŒããŸããããã¡ã€ã«ã®ãªãŒãã³ã倱æãããšãã«ç¥ãããŠãã ãããã
StackOverflowã®å®éã®äŸã次ã«ç€ºããŸãã

åé¡ã®ãªããšé·ã説æïŒ ãã®ç·ã¯äœããçè§£ããããšããŠããŸãã ãããŠæåŸã«ãåœŒã¯æ¬¡ã®è³ªåãããŸããããã®å®çŸ©ã¯çåãæèµ·ããŸããVirtualAllocãåŒã³åºããŠããã®ã¯èª°ã§ããïŒ ããŒããããŒãžã£ãŒãŸãã¯.NETã©ã³ã¿ã€ã ã§ããïŒã
ãã®ã¿ã¹ã¯ã«å¯ŸåŠããæ¹æ³ãç¥ã£ãŠãããšæããŸãã

VirtualAlloc
ãã¬ãŒã¯ãã€ã³ããèšå®ããå¿
èŠãªãã®ããã¹ãŠèŠã€ããŸãã ãã¹ãŠãããªãæçœã§ã-颿°ãåŒã³åºããŠãã人ãç¥ãããã§ããïŒ ããã«ãã¬ãŒã¯ãã€ã³ãã眮ããå¿
èŠãªæ
å ±ãååŸããŸãããã£ãšç°¡åãªããšã¯äœã§ããïŒ ãã®ããã
VirtualAlloc
ã«ãã¬ãŒã¯ãã€ã³ããèšå®ããå²ãåœãŠãããŠããã¡ã¢ãªéãåºåããŸãã ãããŒãžã³ãŒãã®åŒã³åºãã¹ã¿ãã¯ïŒ
!clrstack
ïŒãåºåããŸã-ããã¯ç§ã話ããäŸã§ãã
ãããã£ãŠããã®äŸã§ã¯ã次ã®ããã«è¡šç€ºãããŸããã¬ããŒãžã³ã¬ã¯ã¿ãŒããä»®æ³ã¡ã¢ãªãå²ãåœãŠãŸãã
gc_heap
ã¹ã¿ãã¯ã
grow_heap_segment
ã
virtual_alloc_commit_for_heap
ã§ãã³ã³ãã³ããèªã¿åãããã«
XMLDictionaryReader
ã«ãã£ãŠåŒã³åºãã
XMLDictionaryReader
ãã
åŸç¶ã®åŠçã§ãã¬ãŒã¯ãã€ã³ããã©ããã«é
眮ããææ³ã¯ããããããã®ã¬ããŒãã®äžéšãšããŠæäŸããæãéèŠãªãã®ã§ãã ããã¯ãVisual Studioã«ã¯ãªãéåžžã«åŒ·åãªããŒã«ã§ãã Visual Studioã¯ããã¬ãŒã¯ãã€ã³ããæ¿å
¥ãããœãŒã¹ã³ãŒããããå Žåã«é©ããŠããŸãã ãã ããVisual Studioã§ã«ã¹ã¿ã ã¢ã¯ã·ã§ã³ãæ¡ä»¶ãªã©ãæäœããå¿
èŠãããå Žåã¯ãåºæ¬çãªãµããŒãã®ã¿ããããŸãã WinDbgã䜿çšãããšãããã«å€ãã®ããšãã§ããŸãïŒ ãŸããWinDbgã¯ããã¬ãŒã¯ãã€ã³ããæ¿å
¥ãããœãŒã¹ã³ãŒãããªãå ŽåïŒWindows APIåŒã³åºããŸãã¯ããã€ãã®å
éšCLR颿°ã«é
眮ããäºå®ãããå Žåãªã©ïŒã«ãã¯ããã«åªããŠããŸãã WinDbgã¯ãšãŠããã¬ã³ããªãŒã ãšã¯èšããŸããããééããªãéåžžã«åŒ·åã§ãã
å¥ã®äŸã«åãæ¿ããŸãããã äžè¯ãªããžã§ã¯ãã1ã€ãããã®ãªããžã§ã¯ãã®èšå€§ãªã³ã¬ã¯ã·ã§ã³ããããšããŸãã ãªããªããžã§ã¯ããæªãã®ã§ããïŒ ããšãã°ããšã³ã³ãŒããäžæããå°ããªããããæã€æåaãå«ãŸããŠããŸãã ç§ãèŠã€ããããã®ãå£ããããªããžã§ã¯ãã

ããŸãçŸãããããŸããããæ©èœããŸãã ã¬ããŒãã®çµããã«åãã£ãŠããã®åé¡ã解決ããå¥ã®æ¹æ³ã瀺ããŸãã ãã®ãããæåã«ã¯ã©ã¹ã®å ŽæãèŠã€ããŸã
!name2ee OrderService!OrderService.Order
ã
ããã¯ç§ãæ¢ããŠããã¯ã©ã¹ã§ã-
Order
ã ããã æ¬¡ã«ãã¯ã©ã¹ãã³ããäœæããŠãå¿
èŠãªãã£ãŒã«ããã©ãã«ããããèŠã€ããŸãïŒãªããžã§ã¯ãã®å
é ãåºæºã«ããŠïŒã
[
Address
ãã£ãŒã«ãã«èå³ããããŸãã ã芧ã®ãšããããªããžã§ã¯ãã®å
é ããã®ãªãã»ããã¯4ã§ãã

ããšã¯ãããŒãå
ã®
Order
ãªããžã§ã¯ããèŠã€ããŠããªããžã§ã¯ãã®å
é ãããªãã»ãã4ã®è¡ãèŠã€ããã ãã§ãã ãã®åŸãç·ã®å
åŽãèŠãŠããäžã«äžžãç¹ãããããã©ããã確èªããå¿
èŠããããŸãã
è¡ãå床æžãçŽãããšã¯ãããŸãã-ããã¯äžèŠã§ãããããã€ãã®éèŠãªç¹ã«èšåããŸãã
- ãããã¬ãŒãéå§ãã
.foreach
ã«ãŒãããããŸãã ããã¯ããªãããããã§ãã ãããŠããã®.foreach
ã«ãŒã.foreach
ã¯ã远å ã®.foreach
ã¹ããŒãã¡ã³ãããããŸã-ã€ãŸã å®éã®ãœãããŠã§ã¢ããžãã¯ã ãããè¡ãä»ã®æ¹æ³ã¯ãããŸãããããããããããWinDbgã§å®è£
ããæãç°¡åãªæ¹æ³ã¯ããªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ãåæããç¬èªã®ã³ãŒããæžãããšã§ãïŒããã»ã¹ãå®è¡ããŠããã·ã¹ãã ã«ã¢ã¯ã»ã¹ã§ããå Žåããããè¡ãããšãã§ããŸãïŒ ã
- ãã®çµæãäžéšã®ãªããžã§ã¯ãã§ã¯ãã¢ãã¬ã¹ãã£ãŒã«ãã«ããããä»ããŠããŸãã
- ããã¯ãç§ãæ¢ããŠãããªããžã§ã¯ãã233HÃ¥mptonStreetãã§ãã ãã®ã¢ã€ãã¢ã¯ããããã¬ãããã°ã©ã ãå®è¡ããããã®ãã®ã§ãã
æåŸã®äŸïŒæ¡åŒµæ©èœã«ç§»ãåïŒã§ã¯ãããã€ãã®ã¯ãŒã«ãªã³ãã³ãã瀺ããŸãã
äžæè°ãª
wt
ã³ãã³ãããããŸããããã®æå³ãç¥ã£ãŠãã人ã¯ã»ãšãã©ããŸããã ã³ãŒãã®å®è¡ããã¬ãŒã¹ããŸãã 颿°ãååŸãã
wt
å®è¡ãããšããã®é¢æ°ãè¡ããã¹ãŠã®åŒã³åºããåºåãããŸãã ãã®å Žåããã¬ãŒã¹ã®æ·±ããå¶éã§ããŸãã
ããšãã°ã
mark_phase
éã«ã¬ããŒãžã³ã¬ã¯ã¿ãŒãäœãããã®ãèå³ããããŸããã ããã§ã¯ã
mark_phase
ãšããã¬ããŒãžã³ã¬ã¯ã¿ãŒé¢æ°ã«ãã¬ãŒã¯ãã€ã³ããèšå®ããŠã
wt
ãå®è¡ããŠã¿ãŸãããã

ãã®çµæããã®çŸããããªãŒãåŸãããŸãïŒæ·±ãã1ã«å¶éããŸããïŒ
mark_phase
ã«ãã£ãŠ
mark_phase
ãããã¹ãŠã®é¢æ°ãååŸããŸãã ã¬ããŒãžã³ã¬ã¯ã¿ãŒã®åäœã«èå³ãããå Žåã¯ãããã«å€ãã®è©³çްããããŸãïŒ
generation_size
ã
GcScanRoots
ã
scan_background_roots
ããã³ä»ã®é¢æ°ã®ããŒãïŒã å®å
šãªåºåã«ã¯è€æ°ã®ããŒãžãå«ãŸããŸãã æåŸã«ããã¹ãŠã®æ©èœãšå®è¡ãããã³ãã³ãã®æ°ãå«ãã¬ããŒãã衚瀺ãããŸãã

ãããã£ãŠã
mark_through_cards_for_segment
ã
mark_through_cards_for_large_...
ãªã©ã®åœä»€æ°ã®èгç¹ããæããé«äŸ¡ãªã颿°ãèŠãããšãã§ã
mark_through_cards_for_large_...
ã
ãããã¬å
éšã®ãããã¡ã€ã©ã®ããã«èŠããŸãã ãããã¡ã€ãªã³ã°ã¯ãããã°ã©ã ã®æç€ºã«åŸã£ãŠæ®µéçã«é²ãããšã匷調ããããšãéèŠã§ãã éåžžã«é
ããã€ãŸã ãããã¡ã€ãªã³ã°èªäœã¯é©åã§ã¯ãããŸããã ããããç¹å®ã®æ¹æ³ã§äœãèµ·ãã£ãŠããããçè§£ããããšã¯éåžžã«è¯ãããšã§ãã
æ¡åŒµæ©èœ
äŒè©±ã®ãã®éšåã§ã¯ãããã€ãã®äŸ¿å©ãªæ¡åŒµæ©èœã玹ä»ããŸãã
Pykd
ãããŠããŸããŸãã®ãã®ã䜿çšããŠãããã¬ãŒçšã®ã¹ã¯ãªãããäœæã§ããæ¡åŒµæ©èœããå§ããŸãã

åã«èŠãã¹ã¯ãªããã»ã©æªãã¯ãããŸããã ããã¯PyKDãšåŒã°ããéåžžã«çŽ æŽãããæ¡åŒµæ©èœã§ãã PyKDã¯äœãããŸããïŒ Pythonãå®è¡ããŠWinDbgãèªååã§ããŸã-ã€ãŸã WinDbgã³ãã³ããå®è¡ããåºåãåæããWinDbgã§PythonããŒã«ã䜿çšããŸãã
äžèšã®äŸã¯ããŸãè峿·±ããã®ã§ã¯ãããŸããã ããã§ã¯ãã¹ã¿ãã¯ãç ŽæããŠããå Žåã«ã¹ã¿ãã¯ãä¿®æ£ããããšããŠããŸãã ãã ãããã®èãã¯ãWinDbgã§å®è¡ã§ããã»ãšãã©ã®ããšã«å¯ŸããŠPython APIã䜿çšããããšã§ãã ã²ã©ãWinDbgèšèªã§æžããªã1ã€ã®æ¹æ³ã¯ãPythonã䜿çšããããšã§ãã
ç§ã«ã¯ãheap_stat.pyãšåŒã°ããPyKDã䜿çšããŠäœæãããåªããã¹ã¯ãªããããããŸãã

å®éãããã¯.NETçšã§ã¯ãªããC ++ã¢ããªã±ãŒã·ã§ã³çšã§ãããC ++éçºè
ã«ãåã«ç€ºããæ©èœã®äžéšãæäŸããŸãïŒããŒããšããã«ãããªããžã§ã¯ãã®è¡šç€ºïŒã .NETã®å ŽåããããŸã§èŠãŠããããã«ãããã¯éåžžã«ç°¡åã§ãã C ++ã®å Žåãããã¯ããå°ãè€éã§ãã
ãã®æ¡åŒµæ©èœã¯ãããŒãC ++ã§åäœããPythonã¹ã¯ãªããã§ããããªããžã§ã¯ããæ€çŽ¢ããŠããã®ã¿ã€ãã®ãªããžã§ã¯ãã®æ°ã衚瀺ããŸãã å Žåã«ãã£ãŠã¯ãåèšãµã€ãºãåºåã§ããŸãã WinDbgã¹ã¯ãªããèšèªã®ã¿ã䜿çšããŠãããè¡ãããšã¯éåžžã«å°é£ã§ãããPythonã䜿çšããããšãã§ããŸãã çµå±ã®ãšãããããã¯Pythonã§ãã
æ¡åŒµã¢ãã«
ä»ã®ããã€ãã®æ¡åŒµæ©èœãèŠãŠã¿ãŸãããã ååãšããŠãæ¡åŒµã¢ãã«ã¯éåžžã«åçŽã§ãã

WinDbgã®åæ¡åŒµæ©èœã¯åãªãdllã§ãã 颿°ã®ãšã¯ã¹ããŒãããµããŒãããä»»æã®èšèªã§ãC ++ãŸãã¯CïŒ-ã§èšè¿°ã§ããŸãã ãããŠãæ¡åŒµæ©èœããããã¬ãŒã«æž¡ããå颿°ãã³ãã³ããšããŠå®è¡ããã ãã§ãã
æ¡åŒµæ©èœã¯ããããã¬ãŒAPIã«ã¢ã¯ã»ã¹ã§ããŸãã æ¡åŒµæ©èœãäœãã衚瀺ããå Žåãããšãã°ãã¡ã¢ãªå
ã®ãªããžã§ã¯ããèŠãå Žåããããã¬ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«ã¢ã¯ã»ã¹ã§ãããšããŸãã
åºæ¬çã«ã©ã®ããã«èŠãããã瀺ãããã«ç§ãèšèšããç°¡åãªæ¡åŒµæ©èœã次ã«ç€ºããŸãã

ãã®æ¡åŒµæ©èœã¯ãã³ã³ãã³ããURLã§è¡šç€ºããŸãã ãããã¬ãŒãããHTTPèŠæ±ãå®è¡ããåä¿¡ããHTMLã³ãŒããå°å·ã§ããŸãã
æ¡åŒµæ©èœã¯CïŒã§èšè¿°ãããŠãããéåžžã«ç°¡åã§ããçµæãã©ã®ããã«èŠããããèŠãŠã¿ãŸãããã ãããè¡ãããã«ãWinDbgãšåå å¯èœãªããã»ã¹ïŒã¡ã¢åž³ãªã©ïŒãèµ·åããŸãã ãã®åŸãæ¡åŒµæ©èœãããŠã³ããŒãããŸããããšãã°ãgoogle.comã«ã¢ã¯ã»ã¹ã§ããŸãã ã€ã³ã¿ãŒãããæ¥ç¶ãæ©èœããå Žåããã®çµæãåŸãããŸãã

ããã¯ãããããã·ã¢èªã§ãïŒãšã³ã³ãŒãã¯ãããŸããïŒã
è峿·±ãããšã«ããããã¬ãŒã®åºåã«ã¯çŽæ¥ãªã³ã¯ããããŸãã ããã«ããããã®äœ¿çšããŠãŒã¶ãŒã«ããéãããŸãã ããšãã°ãããã§Bloggerãã¯ãªãã¯ãããšãç»é¢ã®äžéšã«ããããã¬ãŒãå¥ã®ãªã¯ãšã¹ãïŒå¥ã®ããŒãžïŒãå®è¡ããŠããããšãããããŸãã ãã®çµæãéåžžã«ã·ã³ãã«ãªããã¹ããã©ãŠã¶ãŒããããã¬ãŒã«çµã¿èŸŒãŸããŸããã
äžèšã®ãããã¬ãæ¡åŒµããéåžžã«ç°¡åãªäŸãæããŸãããããããããªãã®åºçºç¹ãšããŠåœ¹ç«ã€ããšãé¡ã£ãŠããŸãã æ¬åœã«åŒ·åãªããšãè¡ãç¬èªã®æ¡åŒµæ©èœãäœæããããšã«èå³ãããå Žåã¯ããã®ã¢ãããŒãã䜿çšããŠç¬èªã®æ¡åŒµæ©èœãéçºã§ããŸãã é£ãããããŸãããCïŒã§æ¡åŒµæ©èœãäœæã§ããŸãã
ããã€ãã®æ¢åã®æ¡åŒµæ©èœãèŠãŠã¿ãŸãããïŒç¬èªã®æ¡åŒµæ©èœãäœæããããšã¯å¿
ãããå¿
èŠã§ã¯ãããŸããïŒã
CMKD
64ãããã³ãŒãããããã°ãããšãã«çŽé¢ããªããã°ãªããªãå
žåçãªç¶æ³ã®äŸã次ã«ç€ºããŸãã Windows 64ãããã³ãŒãã«ã¯åŒã³åºãèŠçŽããããæé©åãããã³ãŒãããããã°ãããšãã«é¢æ°ã®åŒæ°ãååŸããããšãéåžžã«é£ãããªããŸãã , , , , â . Visual Studio, WinDbg.

WaitForMultipleObjects
, . , . : « , , , ». 4 , , , , « » 4 .
â
cmkd , . , , .

,
!stack
.
WaitForMultipleObjects
. CMKD , .
, , . , , ,
rdx
, ,
r13
.
r13
- , . , - .
, . , .NET-, C++ 64- Windows ( , ).
SOSEX
â
SOSEX . , , WinDbg , SOSEX â , .NET WinDbg.
SOSEX . Microsoft, ( SOSEX ). .
SOSEX â heap. heap .NET, , , heap â , 10 â , .
? heap â â . :

â
.foreach
â heap , (, ).
!bhi
,
!mroot
, , ,
Byte
Schedule
, , ,
Employee
.
. â SOSEX
!gcroot
. 30 ( 30 ) â 5 . , , ( 30 ).
!mroot
30 0 ( â , , ). , . heap, WinDbg, â SOSEX. â heap. .
netext
, ,
netext . Microsoft â . , . ASP.NET. , heap.

,
!wruntime
, ASP.NET, . .
!whttp
, HTTP-, heap. HTTP-, ( ). , , , , .

HTTP- : , ( ) .. ASP.NET, .
netext SQL- . heap. SQL, , .

,
HttpContext
_request._rawUrl
_response._statusCode
. abc HTTP-.
( )?

netext. .
Order
,
Address
,
$addr
. . â .
netext , .
tracer
, (, , ) â . tracer. WinDbg, .
, , , , , . tracer , ( ) , â . , .

WinDbg, , , , , Visual Studio.
- Visual Studio, , Windows. , , â . WinDbg , , , , TCP, SSL, HTTP â , .
.
.

cdb ( TCP- 5050 ) .

, . x86 :
cdb -remote tcp:server=localhost,port=5050
: , , , .
. Microsoft , . . ãšãŠãå©ãããŸããã
WinDbg, â Smart Client.

, WinDbg WinDbg . dbgsrv.exe, , .
, . , , â ASP.NET.
. , , â .
WinDbg. , , «» . - , «» , - . , , . , , . , . , Visual Studio.
. WinDbg:
CLRMD :
:
msos â CLI-, C#:
20- â « The Performance Investigator's Field Guide », DotNext 2017 Piter ( â 19-20 ).
, «Production Performance and Troubleshooting of .NET Applications»