ユーザ用ツール

サイト用ツール


appendix:garbagecollectorを止める方法

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
appendix:garbagecollectorを止める方法 [2022/03/03 12:52]
fumble
appendix:garbagecollectorを止める方法 [2022/03/07 09:58] (現在)
fumble
行 1: 行 1:
-====GC停止の方法==== +=====GC停止の方法=====
 System.GC.Collectからたどるとves_icall_System_GC_InternalCollectに行き着くじゃろ。\\ System.GC.Collectからたどるとves_icall_System_GC_InternalCollectに行き着くじゃろ。\\
-それの宣言を探したら\\ +それの宣言を探したら [[https://github.com/mono/mono/blob/mono-2-0/mono/metadata/gc-internal.h|gc-internal.h]] にあることがわかるじゃろ、その下を見てみれば\\ 
-https://github.com/mono/mono/blob/mono-2-0/mono/metadata/gc-internal.h\\ +<code cpp> 
-にあることがわかるじゃろ、その下を見てみれば\\ +extern void mono_gc_enable (void) MONO_INTERNAL; 
-extern void mono_gc_enable (void) MONO_INTERNAL;\\ +extern void mono_gc_disable (void) MONO_INTERNAL; 
-extern void mono_gc_disable (void) MONO_INTERNAL;\\ +</code>  
-があるじゃろ、あとはわかるな?\\+というあやしげな宣言があるじゃろ、あとはわかるな?\\ 
 +MONO_INTERNALが邪魔で見えない?心の目で見るんだ!\\ 
 +心の目をもってしても見えないじゃと?!\\ 
 +<code cpp> 
 +typedef __int64 (CALLBACK* gcgetheapsize)(); 
 +typedef void    (CALLBACK* gcenabledisable)(); 
 +void 心眼() 
 +
 +    auto module = ::LoadLibrary(lpszMonoParh); 
 +    if (module != nullptr) 
 +    { 
 +        auto getheapsize = (gcgetheapsize)::GetProcAddress(module, "mono_gc_get_heap_size"); 
 +        auto heapsize = getheapsize(); 
 +        auto disable = (gcenabledisable)((__int64)::GetProcAddress(module, "mono_gc_get_heap_size") + 8i64); 
 +        auto enable = (gcenabledisable)((__int64)::GetProcAddress(module, "mono_gc_get_heap_size") + 16i64); 
 +        disable(); 
 +        enable(); 
 +    } 
 +
 +</code>  
 +これをトレースし、getheapsize();の呼び出しのところをステップインするのじゃ、 
 +<code> 
 +00007FFAA93DB190 E9 D3 C5 13 00       jmp         00007FFAA9517768   
 +00007FFAA93DB195 CC                   int           
 +00007FFAA93DB196 CC                   int           
 +00007FFAA93DB197 CC                   int           
 +00007FFAA93DB198 E9 CF C6 13 00       jmp         00007FFAA951786C   
 +00007FFAA93DB19D CC                   int           
 +00007FFAA93DB19E CC                   int           
 +00007FFAA93DB19F CC                   int           
 +00007FFAA93DB1A0 E9 9B C6 13 00       jmp         00007FFAA9517840   
 +00007FFAA93DB1A5 CC                   int           
 +00007FFAA93DB1A6 CC                   int           
 +00007FFAA93DB1A7 CC                   int           
 +00007FFAA93DB1A8 E9 D7 D8 13 00       jmp         00007FFAA9518A84   
 +00007FFAA93DB1AD CC                   int           
 +00007FFAA93DB1AE CC                   int           
 +00007FFAA93DB1AF CC                   int           
 +</code>  
 +実装順でそれぞれの関数にジャンプするようになっておるじゃろ。\\ 
 +きれいに8バイトでパディングされておるじゃろ。\\ 
 +mono_gc_get_heap_size\\ 
 +<code> 
 +00007FFAA93DB190 E9 D3 C5 13 00       jmp         00007FFAA9517768   
 +</code> 
 +mono_gc_disable\\ 
 +<code> 
 +00007FFAA93DB198 E9 CF C6 13 00       jmp         00007FFAA951786C   
 +</code> 
 +mono_gc_enable\\ 
 +<code> 
 +00007FFAA93DB1A0 E9 9B C6 13 00       jmp         00007FFAA9517840   
 +</code> 
 +今度こそこれでわかるな?\\ 
 +飛んだ先が正しいかもちゃんとステップインして確認するのじゃぞ?\\
appendix/garbagecollectorを止める方法.1646279563.txt.gz · 最終更新: 2022/03/03 12:52 by fumble