ãã®èšäºã§ã¯ãããŒãäžã®ãªããžã§ã¯ãã®å Žæã«çŠç¹ãåœãŠãŸãã
èªè ã¯æ¬¡ã®ç¥èãæã£ãŠãããšæ³å®ãããŸãã
1.ã¹ã¿ãã¯
2.ãããŒãžããŒã
3. GC
4.匱ãåç §
ObjectInstance
ObjectInstance -ObjectRefãæãã¢ãã¬ã¹ã«ããããŒã¿æ§é ïŒãªããžã§ã¯ãïŒã
éèŠãªã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ãä¿åãããå ŽåããããŸãã
1.ã¹ã¬ããã¹ã¿ãã¯å
2. GCããŒãå ã
ãµã€ãºã«å¿ããŠãåç §ã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ãä¿åã§ããŸãã
1.ã¬ããŒãžã³ã¬ã¯ã¿ãŒããŒãïŒãµã€ãºãæ倧85000ãã€ãã®ãªããžã§ã¯ãïŒ
2.ã©ãŒãžãªããžã§ã¯ãããŒãïŒ85,000ãã€ããè¶ ãããªããžã§ã¯ãïŒ
å³1.ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã®æ§é ã®äŸ
å³1ãããããããã«ãObjectInstanceã«ã¯æ¬¡ã®ãã£ãŒã«ããå«ãŸããŠããŸãã
1.ãªããžã§ã¯ãããããŒ
2.ã¿ã€ããã³ãã«ïŒãã®ãã£ãŒã«ãã®æ€èšã¯èšäºã®ç¯å²å€ã§ãïŒ
3.ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã®ãã£ãŒã«ã
4.æååãªãã©ã«ãžã®ãªã³ã¯
ãªããžã§ã¯ãããããŒ
å³1ãããäžåºŠèŠãŠã¿ãŸããããã芧ã®ããã«ãObjectRefã¯ãObjectInstanceã®å é ãã4ãã€ãã®ã¢ãã¬ã¹ãªãã»ãããæããŸãã ããã¯æé©åã®ããã«è¡ãããŸã-ãªããžã§ã¯ãããããŒã«ã¯ããªããžã§ã¯ãã€ã³ã¹ã¿ã³ã¹ã®æ®ãã®ãã£ãŒã«ãã»ã©é »ç¹ã«ã¯äœ¿çšãããªãæ å ±ãå«ãŸããŸãã
ãã®ãã£ãŒã«ãã«ã¯ãåæãããã¯ãšã³ããªããŒãã«ã®ã»ã«çªå·ãå«ãŸããŸãã æ°ã¯1ããã«ãŠã³ããããŸãã ããã¯ã¹ããŒãã¡ã³ããŸãã¯GetHashCodeïŒïŒã¡ãœãããObjectInstanceã«äœ¿çšãããããšããªãå Žåããªããžã§ã¯ãããããŒã»ã«ã«0ãæ ŒçŽãããŸãã
åæãããã¯ãšã³ããªããŒãã«ãšObjectInstanceã¯ã€ã³ããã¯ã¹ã«ãã£ãŠãªã³ã¯ãããŠãããããCLRã¯ã¡ã¢ãªå ã§ãã®ããŒãã«ã®ãµã€ãºãèªç±ã«å€æŽã§ããŸãã
ã€ã³ããã¯ã¹ããªããžã§ã¯ãããããŒã«å«ãŸããåæãããã¯ãšã³ããªããŒãã«ã®ã»ã«ã«ã¯ãåãObjectInstanceãžã®åŒ±ããªã³ã¯ãå«ãŸããŸããããã¯ãCLRããã®ã»ã«ã®ææè ã远跡ã§ããããã«ããããã§ãïŒããšãã°ãã¹ã¬ãããåæããããïŒã
ãŸãããã®ã»ã«ã«ã¯ãSyncBlock Listæ§é å ã®SyncBlockãªããžã§ã¯ããžã®åç §ãå«ãŸããŠããŸãã SyncBlockã«ã¯ãæçšã§ã¯ããããã£ãã«äœ¿çšãããªãæ å ±ãå«ãŸããŠããŸãã
1.ãµã³ã¯æ å ±
2. AppDomainã€ã³ããã¯ã¹
3.ãªããžã§ã¯ãããã¯ããŒã¿
4.ããã·ã¥ã³ãŒã
äŸãèããŠã¿ãŸãããã ãã³ã³ãŒãïŒ
class Sample { TestClass sync = new TestClass (); void Main() { lock (sync) { //, } sync.GetHashCode(); } } * This source code was highlighted with Source Code Highlighter .
class Sample { TestClass sync = new TestClass (); void Main() { lock (sync) { //, } sync.GetHashCode(); } } * This source code was highlighted with Source Code Highlighter .
class Sample { TestClass sync = new TestClass (); void Main() { lock (sync) { //, } sync.GetHashCode(); } } * This source code was highlighted with Source Code Highlighter .
class Sample { TestClass sync = new TestClass (); void Main() { lock (sync) { //, } sync.GetHashCode(); } } * This source code was highlighted with Source Code Highlighter .
class Sample { TestClass sync = new TestClass (); void Main() { lock (sync) { //, } sync.GetHashCode(); } } * This source code was highlighted with Source Code Highlighter .
class Sample { TestClass sync = new TestClass (); void Main() { lock (sync) { //, } sync.GetHashCode(); } } * This source code was highlighted with Source Code Highlighter .
class Sample { TestClass sync = new TestClass (); void Main() { lock (sync) { //, } sync.GetHashCode(); } } * This source code was highlighted with Source Code Highlighter .
class Sample { TestClass sync = new TestClass (); void Main() { lock (sync) { //, } sync.GetHashCode(); } } * This source code was highlighted with Source Code Highlighter .
class Sample { TestClass sync = new TestClass (); void Main() { lock (sync) { //, } sync.GetHashCode(); } } * This source code was highlighted with Source Code Highlighter .
class Sample { TestClass sync = new TestClass (); void Main() { lock (sync) { //, } sync.GetHashCode(); } } * This source code was highlighted with Source Code Highlighter .
class Sample { TestClass sync = new TestClass (); void Main() { lock (sync) { //, } sync.GetHashCode(); } } * This source code was highlighted with Source Code Highlighter .
class Sample { TestClass sync = new TestClass (); void Main() { lock (sync) { //, } sync.GetHashCode(); } } * This source code was highlighted with Source Code Highlighter .
class Sample { TestClass sync = new TestClass (); void Main() { lock (sync) { //, } sync.GetHashCode(); } } * This source code was highlighted with Source Code Highlighter .
class Sample { TestClass sync = new TestClass (); void Main() { lock (sync) { //, } sync.GetHashCode(); } } * This source code was highlighted with Source Code Highlighter .
3è¡ç®ã§ã¯ãåæãªããžã§ã¯ãã®Object Headerãã£ãŒã«ãã«å€0ãå«ãŸããŠããŸããã次ã«7è¡ç®ã§ã¯ããã£ãŒã«ãå€ãå€åããŠãŒã以å€ã«ãªããŸãã ããã¯ãCLRãSyncBlockãªã¹ãã«SyncBlockãªããžã§ã¯ããäœæãããªããžã§ã¯ãããããŒã«ã¬ã³ãŒãã€ã³ããã¯ã¹ãé 眮ããããã§ãã 11è¡ç®ã§ã¯ãããã·ã¥å€ãSyncBlockãªããžã§ã¯ãã«é 眮ãããŠããŸãã
SyncBlockãªããžã§ã¯ãã®æ®ãã®ãã£ãŒã«ãã«ã€ããŠã¯ããã®èšäºã®ç¯å²å€ã§ãã
ãªããžã§ã¯ãã€ã³ã¹ã¿ã³ã¹ãã£ãŒã«ããšæååãªãã©ã«
Type Handleã®èåŸã«ã¯ãã€ã³ã¹ã¿ã³ã¹ãã£ãŒã«ãã®ãªã¹ããããããã®é·ãã¯ç°ãªããŸãã ããã©ã«ãã§ã¯ãã¡ã¢ãªãå¹ççã«äœ¿çšããããã£ãŒã«ãéã®ã®ã£ãããæå°ã«ãªãããã«ãã€ã³ã¹ã¿ã³ã¹ãã£ãŒã«ããé 眮ãããŸãã
ãªã¹ã1ã¯SimpleClassã¯ã©ã¹ã瀺ããŠããŸãããã®ã¯ã©ã¹ã§ã¯ããµã€ãºã®ç°ãªãããã€ãã®ã€ã³ã¹ã¿ã³ã¹å€æ°ã宣èšãããŠããŸãã
å³2. SimpleClassãªããžã§ã¯ãã€ã³ã¹ã¿ã³ã¹ã®[ã¡ã¢ãª]ãŠã£ã³ããŠ
å³ å³2ã¯ãSimpleClassãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãã¡ã¢ãªã®å 容ã衚瀺ãããŠã£ã³ããŠã§ã©ã®ããã«èŠãããã瀺ããŠããŸãã
ãããã¬ã¡ã¢ãªãŠã£ã³ããŠãéãåã«ïŒãããã°-> Windows->ã¡ã¢ãª-> Memory1ïŒãreturnã¹ããŒãã¡ã³ãã«ãã¬ãŒã¯ãã€ã³ããèšå®ãããŠããŸããã 次ã«ãECXã¬ãžã¹ã¿ã«å«ãŸããsimpleObjectã¢ãã¬ã¹ã§ãã¡ã¢ãªãã³ãã衚瀺ããå¿ èŠããããªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã®ã¢ãã¬ã¹ã決å®ããŸããã
1.æåã®4ãã€ããããã¯ã¯syncblkçªå·ã§ãã ãã®ãªããžã§ã¯ãã®åæã³ãŒããèšè¿°ããªãã£ãããïŒãããŠãã®ããã·ã¥ã³ãŒãã«ã¢ã¯ã»ã¹ããªãã£ãããïŒããã®æ°ã¯0ã§ãã
2.ã¹ã¿ãã¯ã«é 眮ãããsimpleObjectå€æ°ã«æ ŒçŽããããªããžã§ã¯ããžã®åç §ã¯ã4ãã€ãã瀺ãããã®å é ã¯ãªãã»ãã4ã§ãã
3.次ã«ãå€æ°l1ã®8ãã€ãå€ã®ã¡ã¢ãªå ãžã®é 眮ã§ãã
4. Stringåã®strå€æ°ã¯ãGCããŒãã§ãã¹ããããæååã®ã€ã³ã¹ã¿ã³ã¹ãæã4ãã€ãã®ObjectRefåç §ã«ãã£ãŠè¡šãããŸãã
5.次ã«ãintåã®å€æ°i1ã8ãã€ããå æããŠé 眮ãããŸãã
6. charåã®2ã€ã®å€æ°-c1ããã³c2-ã䞊ãã§é 眮ãããŠããŸãã
7.çãã¿ã€ãã®2ã€ã®å€æ°-s1ããã³s2-ãã䞊ãã§ãé 眮ãããŸãã
8.ã¿ã€ãByteã®å€æ°b1ãb2ãb3ãb4ã¯DWORDã«ããã¯ãããããµã€ããã€ãµã€ããã«é 眮ãããŸãã
ããã©ã«ãã§ã¯ããªããžã§ã¯ãã®ã¡ã³ããŒã¯ããœãŒã¹ã³ãŒãã§å®£èšãããŠããé åºã§å¿ ãããã¡ã¢ãªã«é 眮ããããšã¯éããŸããã
ã¡ã¢ãªã«ãã£ãŒã«ããé 眮ãããšãã«åå¥ã·ãŒã±ã³ã¹ã芳å¯ããã«ã¯ãStructLayoutAttributeå±æ§ã䜿çšããå¿ èŠããããŸãã ãã®å±æ§ã¯ã次ã®å€ãæã€LayoutKindåæãå ¥åå€ãšããŠåãå ¥ããŸãã
1.ã·ãŒã±ã³ã·ã£ã«-ãªããžã§ã¯ãã®ã¡ã³ããŒã¯ãã¢ã³ãããŒãžã¡ã¢ãªã«ãšã¯ã¹ããŒãããããšãã®å€èŠ³ã®é åºã§é çªã«é 眮ãããŸãã
2.æ瀺ç-管çãããŠããªãã¡ã¢ãªå ã®ãªããžã§ã¯ãã®åã¡ã³ããŒã®æ£ç¢ºãªäœçœ®ã¯æ瀺çã«å¶åŸ¡ãããŸãã åã¡ã³ããŒã¯ãFieldOffsetAttributeå±æ§ã䜿çšããŠãã¿ã€ãå ã®ãã®ãã£ãŒã«ãã®äœçœ®ã瀺ãå¿ èŠããããŸãã
3.èªå-CLRã¯ãã¢ã³ãããŒãžã¡ã¢ãªå ã®ãªããžã§ã¯ãã®ã¡ã³ããŒã«é©åãªå Žæãèªåçã«éžæããŸãã ãã®åæã¡ã³ããŒã䜿çšããŠå®çŸ©ããããªããžã§ã¯ããžã®ã¢ã¯ã»ã¹ã¯ããããŒãžã³ãŒãã®å€éšã§ã¯èš±å¯ã§ããŸããã ãã®ãããªæäœãå®è¡ããããšãããšãäŸå€ãã¹ããŒãããŸãã
ã¡ã¢ãªã®éæ§é åã³ã³ãã³ãã調ã¹ãåŸãSon of StrikeïŒSOSïŒãŠãŒãã£ãªãã£ã䜿çšããŠãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã調ã¹ãŸãã
ãããžã§ã¯ããã¢ã³ãããŒãžãããã°ã¢ãŒãã«ãïŒããããã£->ãããã°->ã¢ã³ãããŒãžã³ãŒããããã°ãæå¹ã«ããïŒãã€ããã£ãšã€ããŠã£ã³ããŠïŒctrl + alt + IïŒãéãã次ã®ã³ãã³ããå®è¡ããŸãã
*ãã®ãœãŒã¹ã³ãŒãã¯ã ãœãŒã¹ã³ãŒããã€ã©ã€ã¿ãŒã§åŒ·èª¿è¡šç€ºãããŸããã
- .load sos
- ïŒDumpHeapã¿ã€ãã®SimpleClass
åºåã®çµæãšããŠãç¹å®ã®ã¿ã€ãã®ãã¹ãŠã®ããŒããšãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã®ã³ã³ãã³ããååŸããŸãã
å³3.ãïŒDumpHeap -type SimpleClassãã³ãã³ãã®çµæ
å³3ãããããããã«ããªããžã§ã¯ãã®ãµã€ãºã¯36ãã€ãã§ãã ãããã®36ãã€ãã«ã¯æ¬¡ã®ãã®ãå«ãŸããŸãã
1. SimpleClassã€ã³ã¹ã¿ã³ã¹ã®ãã£ãŒã«ãã¯28ãã€ããå æããŸãïŒSimpleClassã€ã³ã¹ã¿ã³ã¹ã«ã¯ãµã€ãºã4ãã€ãã®ãªãã©ã«ããŒãã«ãžã®åç §ã®ã¿ãå«ãŸãããããæååã®é·ãã¯é¢ä¿ãããŸããïŒã
2.æ®ãã®8ãã€ãã¯ããªããžã§ã¯ãããããŒïŒ4ãã€ãïŒããã³ã¿ã€ããã³ãã«ïŒ4ãã€ãïŒã«å«ãŸããŠããŸãã
simpleObjectã€ã³ã¹ã¿ã³ã¹ã®ã¢ãã¬ã¹ãèŠã€ããŸãããã³ãã³ã "ïŒDumpObj 0x0214ba30"ã䜿çšããŠããã®ã€ã³ã¹ã¿ã³ã¹ã®å 容ããã³ãããŸãããã
å³4.ãïŒDumpObj 0x0214ba30ãã³ãã³ãã®çµæ
CïŒã³ã³ãã€ã©ã¯ãããã©ã«ãã§ãã¯ã©ã¹ã¡ã³ããŒã«LayoutType.Autoã¬ã€ã¢ãŠãã䜿çšãããããã¯ã©ã¹ããŒããŒã¯ããã£ãŒã«ãéã®ã®ã£ãããæå°åããããã«é©åãšæãããããã«ãã£ãŒã«ããé 眮ã§ããŸãã
ææïŒ
MSDN