まだ開始されていないプロセスにVisualStudioをアタッチするにはどうすればよいですか?


89

何らかの理由でVisualStudioから実行できない.NETプログラム(Excel 2010テンプレートプロジェクトから作成されたExcelファイル)があり、起動イベントをデバッグする必要があります。

プログラムの初期化後に発生するイベントをデバッグしたい場合は問題ありません。エクスプローラーからプログラムを実行し、プロセスをVisual Studioにアタッチして、コードにいくつかのブレークポイントを追加します。ただし、ここでは、起動イベントにブレークポイントを設定する必要があります。PIDに依存せずに、特定のプロセス名やその他の機能するソリューションに基づいて、プロセスをVisualStudioにアタッチできる必要があります。

もちろんThread.Sleep(1000)、スタートアップイベントにを追加して、Visual Studioでプロセスをアタッチする時間を与えることは、問題外です。

回答:


97

実際にできます。あなたはそれに執着せず、​​あなたはそれを始めます。プロジェクトのプロパティの[デバッグ]タブで、[コマンド]テキストボックスにアタッチするプログラムのパスを指定します。

[コマンド引数]ボックスに、プログラムの任意のコマンドライン引数を入力することもできます。

ここに画像の説明を入力してください

「接続」が「いいえ」に設定されていることを確認します。


6
良い解決策ですが、この場合、F5を押すことは機能しないことに注意してください。代わりに、関連するプロジェクトを右クリックし、コンテキストメニューから[デバッグ]> [新しいインスタンスの開始]をクリックします。
ハーマンコーデス2016年

1
F5が機能するためには、プロジェクトがソリューションの開始プロジェクトである必要があります。これを行うには、ソリューションエクスプローラーでプロジェクトを右クリックし、[スタートアッププロジェクトとして設定]を選択します。
ティビ2016年

1
また、プログラムに外部依存関係がある場合は、「作業ディレクトリ」も変更する必要があります。
Priyank 2017年

「ネイティブコードのデバッグを有効にするをチェックする必要がある場合があります(プロジェクトのプロパティ→デバッグデバッガを有効にする)。
Peter Mortensen 2018

そして、40のプロジェクトを含むソリューション全体に対してこれをどのように行うのでしょうか。
TonyTannous19年

23

起動時に例外をスローすることでクラッシュする、外部で生成されたプロセスでC ++プラグインをデバッグしていましたが、これは完全に機能しました。

VisualStudio用の無料のReattachExtensionを追加します。起動する前に、プロセス名に再度アタッチするように依頼してください。プロセス名の起動を待機していることを示すモーダルダイアログが表示されます。

ここでプロセスを起動すると、Visual Studioデバッガーがすぐにアタッチされ、例外をキャッチしてブレークポイントに到達します。


千回はい!
itslittlejohn 2015年

デッドロックが発生しました。ターゲットが起動されたときに管理者認証を要求し、pwdと入力してvsを再起動した後、再接続がなくなりました。管理者認証なしの場合のみ、再接続が含まれます。
エリック

2
私にはうまくいきません。クラッシュがすでに発生した後でも、接続が遅すぎます。1秒に1回、既存のプロセスをチェックしているようですが、このアプリケーションにはまったく意味がありません。
RIV

20

Visual Studio 2017-2019を使用している場合は、次の手順に従ってください。

  1. ファイル>開く>プロジェクト/ソリューション
  2. .exeを選択してください
  3. デバッグ>デバッグの開始

他の提案よりもはるかに簡単です。プロジェクトのプロパティをいじる必要はなく、拡張機能も必要ありません。


ただし、デバッグシンボルが自動的に検出されない場合は、Visual Studioにその場所を通知する必要があります
Matt Thomas

1
5秒で素早く簡単にできる、私はそれが大好きです。ありがとう
ComradeJoecool 2017年

1
exeが起動しましたが、ブレークポイントを設定できませんでした。私は何をすべきか?
エリック

2
@Eric上記のコメントで対応できない場合は、コメントではなくSOの質問として質問することをお勧めします。問題がより明確になり、特定のシナリオを説明する機会が得られます。次に、見つけたものをお知らせください。
マットトーマス

11

似たようなものを探していたときに、この答えを見つけました。私の場合、実行可能ファイルをプロジェクトのスタートアッププログラムとして単純に使用することはできませんでした。これは、実行可能ファイルを簡単に再現できない非常に特殊な環境で開始する必要があるためです(つまり、cygwinから開始)。

mrstrangeによって提案されたReattachExtensionと、非常によく似たAttach To Anything拡張機能調べましたが、実行可能ファイルが閉じるのが速すぎて、拡張機能が通知して添付できないようでした。

最終的に私を助けたのはこれでした:https//stackoverflow.com/a/4042545/1560865、これはMSDNの記事「方法:デバッガーを自動的起動する」を参照しており、次の手順がリストされています。

  1. レジストリエディタ(regedit)を起動します。
  2. レジストリエディタで、HKEY_LOCAL_MACHINEフォルダを開きます。
  3. HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ imageファイル実行オプションに移動します。
  4. イメージファイルの実行オプションのフォルダ、など、デバッグにしたいアプリケーションの名前を見つけmyapp.exeという。デバッグするアプリケーションが見つからない場合:
    a。[画像ファイルの実行オプション]フォルダを右クリックし、ショートカットメニューで[新しいキー]をクリックします。
    b。新しいキーを右クリックし、ショートカットメニューで[名前の変更]をクリックします。c。キー名をアプリケーションの名前に編集します。この例では、myapp.exeです。
  5. myapp.exeフォルダーを右クリックし、ショートカットメニューで[新しい文字列値]をクリックします。
  6. 新しい文字列値を右クリックし、ショートカットメニューで[名前の変更]をクリックします。
  7. 名前をに変更しdebuggerます。
  8. 新しい文字列値を右クリックし、ショートカットメニューで[変更]をクリックします。[文字列編集]ダイアログボックスが表示されます。
  9. [値のデータ]ボックスに、と入力しvsjitdebugger.exeます。
  10. [ OK]をクリックします。
  11. [レジストリ]メニューから、[終了]をクリックします。
  12. vsjitdebugger.exeを含むディレクトリは、システムパスに含まれている必要があります。システムパスに追加するには、次の手順に従います
    。クラシックビューでコントロールパネルを開き、[システム]をダブルクリックします
    b。[システムの詳細設定]をクリックします。
    c。でシステムのプロパティをクリックし高度なタブを。
    d。上の高度なタブをクリックし環境変数を
    e。では環境変数]ダイアログボックス、下のシステム環境変数、選択パスを、クリックし[編集]ボタンをクリックします。
    f。システム変数編集ダイアログボックスで、ディレクトリを[変数値]ボックスに追加します。セミコロンを使用して、リスト内の他のエントリから区切ります。
    g。[ OK]をクリックして、[システム変数編集]ダイアログボックスを閉じます。
    h。[ OK]をクリックして、[環境変数]ダイアログボックスを閉じます。
    私。[ OK]をクリックして、[システムのプロパティ]ダイアログボックスを閉じます。
  13. 次に、任意の方法を使用してアプリケーションを起動します。Visual Studioが起動し、アプリケーションが読み込まれます。

これが将来他の誰かに役立つことを願っています!


3
新しいバージョンのVS(2019年まで)でのこの同じプロセスの手順は次のとおりです。docs.microsoft.com
us

3

プロセスがない場合VisualStudioはそれに接続できません。

ただし、プロジェクトのスタートアッププログラムを、プロジェクトの出力以外のものに設定することはできます。


私がやりたいことが正しいかどうかはすでに調査しましたが、実際はそうです。私の状況は、通常のVisualStudioデバッグの場合ではありません。VisualStudioで開発されたExcel2010テンプレートプロジェクトがあり、テンプレートシートに起動イベントがあります。このテンプレートをVisualStudioから実行し、Excelシートにデータを追加して、ファイルをディスクに保存します。次に、テンプレートアセンブリにも依存するこのファイルを開く唯一の方法は、エクスプローラーから開くことです。したがって、この場合、起動イベントをデバッグできません。もちろん、起動時にデータバインディングなどのデータ処理を行います。
Ucodia 2011年

「ネイティブコードのデバッグを有効にするをチェックする必要がある場合があります(プロジェクトのプロパティ→デバッグデバッガを有効にする)。
Peter Mortensen 2018

3

メッセージボックスを表示できます。これによりアプリケーションがブロックされ、デバッガーをプロセスにアタッチまたは再アタッチし、[OK]をクリックして続行します。

MessageBox.Show("Attach process to debugger and click ok!");

これをフォームコンストラクターに追加できるため(winformsを使用する場合)、コンポーネントの初期化を除いて、これは他の何よりも先に実行されます。

public MainForm()
{
    InitializeComponent();
    MessageBox.Show("Attach process to debugger and click ok!");
}

デバッグが終了したら、その行をコメントアウトします。


3

コードからデバッガーを起動するには、

public static void Main(string[] args)
{
  System.Diagnostics.Debugger.Launch();
}

ただし、アプリケーションを出荷する前に、この行を削除しないでください。コンパイラフラグを使用して、次のことを確認したい場合があります。

    public static void Main(string[] args)
    {
      #if debug
      System.Diagnostics.Debugger.Launch();
      #endif
    }

2
これは、外部プロセスがアプリケーションを起動するのを待っているすべての場合に受け入れられる答えです。
TravellingFox

2

多くの人に合うかもしれない1つの小さな解決策。

  • exeが実行するコードの最初の行に、このコマンドを追加します

    System.Threading.Thread.Sleep(20000)

これにより、exeは何かの処理を開始する前に20秒間スリープ状態になります。次に、プロセスにアタッチするのに20秒かかります。これは、ctrl + alt + pを使用してすばやく実行でき、プロセスを見つけて、Enterキーを押してアタッチします。

答えはあまりありませんが、私にとってはおやつでした:-)


ソースコードを持っている「C」で書かれたCGIをデバッグしなければなりませんでした。私は、バックグラウンドプロセスに取り組む時間をとるためのシンプルで簡単なソリューションでした。
ジョエル・ヘクト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.