ユーザ用ツール

サイト用ツール


appendix:garbagecollectorを止める方法

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  

今度こそこれでわかるな?
飛んだ先が正しいかもちゃんとステップインして確認するのじゃぞ?

コメント

とあるプラグインの制作者, 2022/03/04 19:16
心の目で見えず、どうやって上の2つのAPIのアドレスを見つけ出したのか、
気になったので、よろしければ教えてくださいませんか?
当方で確認したところ、
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などして解析されたのでしょうか?
最後に、素晴らしいプラグインを作っていただいてありがとうございます。
おかげで私の「悲願」が達成され、うれしい限りです。
とあるプラグインの制作者, 2022/03/07 00:52
誤記訂正です。
最初のmono_gc_disableはmono_gc_get_heap_sizeが正しいです。
ふあんぶる, 2022/03/07 09:49
これでわかるかいのぅ・・・
とあるプラグインの制作者, 2022/03/07 17:49
大変よくわかりました。ありがとうございました。
ちなみに私はお察しの通り「速度改善プラグイン」の作者です。
ふあんぶる, 2022/03/07 18:41
マルチスレッド化するほうがむつかしいと思います!
ウニ化するし・・・
ただのダンス好き, 2022/12/31 22:56
GCつながりでお願いです
以下で示されている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
コメントを入力:
 
appendix/garbagecollectorを止める方法.txt · 最終更新: 2022/03/07 09:58 by fumble