=====GC停止の方法=====
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]] にあることがわかるじゃろ、その下を見てみれば\\
extern void mono_gc_enable (void) MONO_INTERNAL;
extern void mono_gc_disable (void) MONO_INTERNAL;
というあやしげな宣言があるじゃろ、あとはわかるな?\\
MONO_INTERNALが邪魔で見えない?心の目で見るんだ!\\
心の目をもってしても見えないじゃと?!\\
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();
}
}
これをトレースし、getheapsize();の呼び出しのところをステップインするのじゃ、
00007FFAA93DB190 E9 D3 C5 13 00 jmp 00007FFAA9517768
00007FFAA93DB195 CC int 3
00007FFAA93DB196 CC int 3
00007FFAA93DB197 CC int 3
00007FFAA93DB198 E9 CF C6 13 00 jmp 00007FFAA951786C
00007FFAA93DB19D CC int 3
00007FFAA93DB19E CC int 3
00007FFAA93DB19F CC int 3
00007FFAA93DB1A0 E9 9B C6 13 00 jmp 00007FFAA9517840
00007FFAA93DB1A5 CC int 3
00007FFAA93DB1A6 CC int 3
00007FFAA93DB1A7 CC int 3
00007FFAA93DB1A8 E9 D7 D8 13 00 jmp 00007FFAA9518A84
00007FFAA93DB1AD CC int 3
00007FFAA93DB1AE CC int 3
00007FFAA93DB1AF CC int 3
実装順でそれぞれの関数にジャンプするようになっておるじゃろ。\\
きれいに8バイトでパディングされておるじゃろ。\\
mono_gc_get_heap_size\\
00007FFAA93DB190 E9 D3 C5 13 00 jmp 00007FFAA9517768
mono_gc_disable\\
00007FFAA93DB198 E9 CF C6 13 00 jmp 00007FFAA951786C
mono_gc_enable\\
00007FFAA93DB1A0 E9 9B C6 13 00 jmp 00007FFAA9517840
今度こそこれでわかるな?\\
飛んだ先が正しいかもちゃんとステップインして確認するのじゃぞ?\\