System.GC.Collectからたどるとves_icall_System_GC_InternalCollectに行き着くじゃろ。
それの宣言を探したら 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
今度こそこれでわかるな?
飛んだ先が正しいかもちゃんとステップインして確認するのじゃぞ?