MDA pInvokeStackImbalance の無効化 ― CLR 2.0 でのデバッグ実行 (2)

(id:NyaRuRu:20051223#p2) の続き.

892 :デフォルトの名無しさん :2005/12/24(土) 15:19:15

その問題に似た投稿があった。

ttp://lab.msdn.microsoft.com/productfeedback/default.aspx

performance of /clr compiled std::string very slow when run under debugger
という投稿。
どうも、MDAってのが悪いようだ。
でも、どうすればいいのか、英文読んでもわからなかった。

Good job!
Diagnosing Errors with Managed Debugging Assistants を参照しつついくつか試してみていると……

899 :デフォルトの名無しさん :2005/12/24(土) 16:33:27

デバッグ中のスピードが激しく遅い件だけど、
COMPLUS_MDA=0
環境変数に加えると、VS2005EEの立ち上げ直後の
1回目のデバッグ実行だけ速くなったwww
2回目以降はまた遅くなる orz
わけがわからん。

900 :デフォルトの名無しさん :2005/12/24(土) 16:55:15

>>899
レジストリ
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="0"
を設定する。
プロジェクトのプロパティのデバッグのvshostを有効にするのチェックを外す。
これで常に速くなった様子。

という感じでほぼ同時に似たような結論にたどり着いた人が……
というわけで適当 workaround その 2.
まず,どうも vshost を有効にしていると 1 回目のデバッグ実行のみしか効果が無さそうなので,とりあえず今のところ vshost は諦める他無さそう.というわけでプロジェクト設定の「デバッグ」の項目から vshost を有効にするのチェックは外しておく.ここから先は 3 通り.

方法1 レジストリキーを使う方法
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework" に "MDA" という値を作って "0" を設定すると MDA が完全に無効化される.
方法2 環境変数を使う方法
"COMPLUS_MDA" という環境変数に "0" を設定すると MDA が完全に無効化される.
方法3 コンフィグファイルを使う方法
"COMPLUS_MDA" という環境変数に "1" を設定するとデバッガはコンフィグファイルを参照するようになる.次に実行ファイルと同じフォルダに "(アプリケーション名.exe).mda.config" というファイルを作成し,次の内容をセット.FDBK38347 の Microsoft からの書き込みにある通り,MDA を完全に殺してしまう必要はなくて,pInvokeStackImbalance のみを無効化すれば今回の件については十分な模様.
<?xml version="1.0" encoding="utf-8" ?>
<mdaConfig>
  <assistants>
    <pInvokeStackImbalance enable="false" >
  </assistants>
</mdaConfig>

ついでに本家にも workaround も入れておきました.