Visual Studioデバッグ中の停止とエラーダイアログの修正方法について

yonotsui 40 評価のポイント
2024-03-10T03:24:29.58+00:00

Visual Studioでデバッグ中に頻繁に問題が発生しております。
操作が一時停止しエラーダイアログが表示されます。
停止する時間は10〜30秒ほどです。

ダイアログの内容は以下の通りです。
「関数(A)を評価するときに安全でない中止を防ぐため、すべてのスレッドの実行が許可されました。そのため、プロセスの状態が変更された可能性があり、ブレークポイントがあってもすべてスキップされました。」
※Aにはデバッグ個所に関連する関数やプロパティの名前空間込みのフルネームが表記されます。

この問題は、特定の状況下で発生します。

  1. 関数内にステップインした場合
  2. 関数のステップオーバーを行った場合
  3. 変数やプロパティにカーソルを合わせた場合

重要なのはこの問題はコンピュータを変更しても発生し、他のソリューションでは発生していないという点です。
したがってソリューションやプロジェクトの設定に関連する可能性があります。

この問題の原因や解決方法について、ご教示いただけますでしょうか。

User's image

・開発環境の情報
OS:Windows 10 Pro
プラットフォーム:Any CPU
出力の種類:Windowsアプリケーション
フレームワーク:.NET8.0
Visual Studioのバージョン:Microsoft Visual Studio Community 2022 (64 ビット) - Current Version 17.8.3
WPFを用いたwindowsアプリを作成しています。

Visual Studio
Visual Studio
Windows、Web、モバイル デバイス用のアプリケーションを構築するための統合開発ツールの Microsoft スイートのファミリ。
35 件の質問
{count} 件の投票

承認済みの回答
  1. gekka 6,846 評価のポイント MVP
    2024-03-10T11:23:18.28+00:00

    背景に写っているコードやメッセージからasync/awaitかTask関連だと推測して、たとえば以下のコードでデバッガがブレークした状態で、ウォッチウィンドウやローカルウィンドウあるいはマウスを重ねてウォッチなどでTestClassのTaskプロパティを見ようとすると、ビジー状態になって似たようなメッセージを表示させることができます。

    class TestClass
    {
        public static void Test()
        {
            var ev = new System.Threading.ManualResetEvent(false);
            TestClass tc;
            System.Threading.Tasks.Task.Run(async () =>
            {
                while (true)
                {
                    tc = new TestClass();
                    ev.Set();
                    await tc.Task.ConfigureAwait(true);
    
                }
            });
            ev.WaitOne();
            System.Diagnostics.Debugger.Break();
        }
    
        public System.Threading.Tasks.Task Task
        {
            get
            {
                if (_t == null)
                {
                    _t = System.Threading.Tasks.Task.Run(() =>
                    {
                        System.Threading.Thread.Sleep(10000);
                    });
    
                }
                return _t;
            }
        }
        private Task _t;
    }
    

    これは、

    • ブレーク中に読み取り(評価)しようとしたTask型のプロパティがビジー状態で安全に中断できないので、Taskを少し実行し(スレッドの実行が許可され)て状態を読み取りました。
    • そのためTaskはブレークのタイミングの状態ではなく少し実行された状態である可能性がある。
    • Task内で実行されていた処理はブレークタイミングとその少し進んだ状態のあいだにブレークポイントが設定されていたかもしれないけれど、評価の邪魔なのでそれらのブレークは無視(スキップ)しました。

    ということになります。

    つまり、ソリューションやプロジェクトの設定ではなく、デバッグが停止した状態で別スレッドで実行されている処理を見ようとしていると発生したことが原因と考えられます。

    ですから、この症状が望ましくないなら、そのような状態を引き起こしているプロパティなどをウォッチ・自動変数・ローカルなどで表示させないようにしてみれば発生しなくなるかもしれません。

    0 件のコメント コメントはありません

0 件の追加の回答

並べ替え方法: 最も役に立つ