17

デバッグ中に「すべてを中断」すると、Visual Studio はスタックの一番上にあるソース コードを開きます。現在作業中のドキュメントにカーソルを置き、他のドキュメントやウィンドウ (例: シンボルがロードされていない) を開かないようにしたいです。

4

3 に答える 3

11

現在のドキュメントにとどまる方法はありますが、そのためには、Visual Studio アドインを作成し、デバッグツールバーに新しい UI コマンドを作成する必要があります。この回答のクレジットは、実際には openshacにも送られます。彼は同様の SO の質問を投稿し、マクロを使用して OP で回避策を提供しました。

実装は非常に簡単です (動作するまでに数分かかりました)。まず、アドイン プロジェクトExecで、ファイル内のメソッドを次のConnect.csように変更します。

public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
{
    handled = false;
    if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
    {
        if(commandName == "BreakInCurrentDocument.Connect.BreakInCurrentDocument")
        {

            // here's where the magic happens
            // ******************************
            var activeWindow = _applicationObject.ActiveWindow;
            _applicationObject.Debugger.Break();
            if (_applicationObject.ActiveWindow != activeWindow)
            {
                _applicationObject.ActiveWindow.Close(vsSaveChanges.vsSaveChangesNo);
            }
            // ******************************

            handled = true;
            return;
        }
    }
}

アドインを作成して登録したら、次のようにします。

  1. Visual Studio のメニューで[ TOOLS ] をクリックします。
  2. カスタマイズ
  3. コマンド
  4. 「ツールバー」ラジオボタンを選択します
  5. 「デバッグ」を選択
  6. コマンドを追加...
  7. [アドイン] カテゴリから、カスタム アドインを選択します。

それでおしまい。

于 2013-02-06T10:24:19.800 に答える
10

http://visualstudiogallery.msdn.microsoft.com/a83505c6-77b3-44a6-b53b-73d77cba84c8から入手できるVSCommands拡張機能の最新ビルド(無料バージョン)には、まさに必要なものがあります。デバッグツールバーとデバッグメニューに[現在のドキュメントに割り込む]ボタンを追加します。

http://vscommands.squaredinfinity.com/Media/VSCommands/BlogPost//blog/breakincurrentdocument.png

于 2013-02-07T01:26:39.780 に答える
2

これは機能です..「break all」を実行すると、プロセスがハングしたと見なされます。このような場合に最初に関心を持つ可能性があるのは - WHERE. したがって、実行されている「現在」の場所に直接誘導されます。IIRC、これはすべての低レベル デバッガーのデファクト スタンダードです。「シンボルがロードされていない」ことを望まない場合は、「逆アセンブルを表示」をマークするだけで、二度とポップアップすることはありません:) (もちろん、代わりに、停止の正確なポイントが表示されます。はい、これも未知のライブラリコードをデバッグするために私自身が何度も使用した機能)

一方、コードを停止する場所がわかっている場合は、代わりにブレークポイントをそこに配置します。

さらに別の方法として (3 つある場合のように)、実際にアプリケーションを停止したい場合は、停止します。中断しないでください。停止するだけです。

あなたの実際の問題は、機能の 1 つを間違った方法で使用しているため、別の機能に悩まされているという事実にあると思います。「break all」を何に使用し、現在のテキスト編集とどのように/なぜ衝突するのか教えてください。代わりに、ここで停止または中断できないのはなぜですか? それとも「切り離す」?

とにかく、機能として、IDE の構成可能性のためだけに、それをオフにするためのオプションが必要であることを認めなければなりません。


編集

ああ、そうです。エディット&コンティニューの素晴らしさをすっかり忘れていました。冗談やからかいではありません。E&C は、他のすべてのプラットフォームにあればいいのにと思う素晴らしい機能です。私はそれを忘れていました.なぜなら...私はラムダ、ジェネリック、foreachなど、エディット・アンド・コンティニュを効果的にブロックする機能を広範囲に使用しています。

とにかく、要点は、エディット コンティニュは使用したい黄金の機能であるため、アプリケーションは「中断」モードである必要があるということです。ただし、「中断」/「一時停止」などをどのように行うかに関係なく、IDE は一時停止が編集ではなく目的であると想定するため、アプリを一時停止した場所が表示されます。

MSVS には、「自分のコードだけを表示する」など、少し役立つオプションがいくつかありますが、問題は解決しません。デバッグ中の編集と継続は、「小規模なローカル編集」用に設計されています。のように、if(x>0)throw new uncaught()代わりにif(x<0)throw new uncaught()。アプリがアサーションまたはブレークポイントで停止し、クラッシュしようとしています。最初の変更の例外ハンドラーが起動しました。チャンスです! クラッシュ ハンドラをアンワインドし、コードを修正してから実行します。ジャストインタイム パッチの方法として、停止した同じ 1 つのメソッド内のすべてが で発生します。

これは、E&C セッション中にメソッド、クラスを追加したり、ジェネリックを変更したりできない主な問題の 1 つです。現在のラムダまたは現在の foreach を編集することは問題ないかもしれませんが、IDE はフローを再配置して新しいコードを適切に実行することができません。これは、「古いコード」の警告が時々表示される理由と少し似ていますが、これらのコード構造では分析がさらに難しく、実装されていません。そしておそらく、MS の TO-DO リストのトップに立つことは決してないでしょう :/

.Net/C# の現在のブームは「ライブ開発」ではなく、モジュール性と単体テストによって大きくサポートされている「notaliveyet 開発」であり、アプリケーションのほとんどの機能をオフラインでテストできるように努力しています..しかしこれはパラダイム シフトであり、小規模なプロジェクトやローカル デスクトップ開発では、単純にやり過ぎになることがあります。

于 2013-02-06T09:06:10.843 に答える