GC停止の方法
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
今度こそこれでわかるな?
飛んだ先が正しいかもちゃんとステップインして確認するのじゃぞ?
コメント
気になったので、よろしければ教えてくださいませんか?
当方で確認したところ、
github.com/Unity-Technologies/mono/blob/unity-5.6/mono/metadata/sgen-gc.c
github.com/dnSpy/dnSpy-Unity-mono/blob/master/unity-5.6.4/mono/metadata/sgen-gc.c
において、mono_gc_disableのすぐ後にmono_gc_disableとmono_gc_enableとが
記述されており、この順序でAPIのアドレスが並んでいることから、「ぷらし~ぼ」では
あのようなアドレス指定となったのでしょうか?
それともmono.dllをdisassemblyなどして解析されたのでしょうか?
最後に、素晴らしいプラグインを作っていただいてありがとうございます。
おかげで私の「悲願」が達成され、うれしい限りです。
最初のmono_gc_disableはmono_gc_get_heap_sizeが正しいです。
ちなみに私はお察しの通り「速度改善プラグイン」の作者です。
ウニ化するし・・・
以下で示されているUnityのOnGuiのGCメモリ発生バグを修正するsybarisプラグインの作成は
可能でしょうか
Garbage collector spikes because of GUI
//forum.unity.com/threads/garbage-collector-spikes-because-of-gui.60217/page-2
ぷらし~ぼプラグイン使用中にOnGuiでmono_gc_out_of_memoryが発生してCrashが多発したので
あとGCには関係ないのですがscarletkomさんが悩んでいらっしゃるUpdateの最後に実行する
方法は以下で示されているMonoBehaviour.Invokeの0秒指定が該当しそうな気がします
【Unity】MonoBehaviour.Invoke()ってなんだろう?
//www.urablog.xyz/entry/2016/08/27/103229