web-dev-qa-db-ja.com

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

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

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

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

66
Ucodia

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

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

enter image description here

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

85
Tibi

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

無料の Visual Studioの拡張機能を再アタッチ を追加します。起動する前にプロセス名に再アタッチするよう依頼します。プロセス名の起動を待機していることを示すモーダルダイアログが表示されます。

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

20
mstrange

Visual Studio 2017-2019を使用している場合は、次の手順に従います。

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

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

11
Matt Thomas

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

Reattach Extensionを mrstrangeで推奨 および非常によく似た Attach To Anything 拡張子として見てみました...通知して添付します。

最終的に私を助けたのはこれです: https://stackoverflow.com/a/4042545/1560865 、MSDNの記事を参照 方法:デバッガーを自動的に起動する -turnは、次のステップをリストします。

  1. レジストリエディター(regedit)を起動します。
  2. レジストリエディターで、HKEY_LOCAL_MACHINEフォルダーを開きます。
  3. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\currentversion\imageファイル実行オプションに移動します。
  4. Image File Execution Optionsフォルダーで、デバッグするアプリケーションの名前(myapp.exeなど)を見つけます。デバッグするアプリケーションが見つからない場合:
    a。 Image File Execution Optionsフォルダーを右クリックし、ショートカットメニューでNew Keyをクリックします。
    b。新しいキーを右クリックし、ショートカットメニューでRenameをクリックします。 c。キー名をアプリケーションの名前に編集します。 myapp.exe、この例では。
  5. myapp.exeフォルダーを右クリックし、ショートカットメニューでNew String Valueをクリックします。
  6. 新しい文字列値を右クリックし、ショートカットメニューで[名前の変更]をクリックします。
  7. 名前をdebuggerに変更します。
  8. 新しい文字列値を右クリックし、ショートカットメニューでModifyをクリックします。 Edit Stringダイアログボックスが表示されます。
  9. Value dataボックスに、vsjitdebugger.exe
  10. [〜#〜] ok [〜#〜]をクリックします。
  11. Registryメニューから、Exitをクリックします。
  12. Vsjitdebugger.exeを含むディレクトリは、システムパスに存在する必要があります。システムパスに追加するには、次の手順を実行します。
    a。クラシックビューでControl Panelを開き、Systemをダブルクリックします。
    b。 システムの詳細設定をクリックします。
    c。 System Propertiesで、Advancedタブをクリックします。
    d。 Advancedタブで、Environment Variablesをクリックします。
    e。 Environment VariablesダイアログボックスのSystem variablesで、Pathを選択し、次にEditボタンをクリックします。
    f。 システム変数の編集ダイアログボックスで、ディレクトリを変数値ボックスに追加します。セミコロンを使用して、リスト内の他のエントリから区切ります。
    g。 [〜#〜] ok [〜#〜]をクリックして、システム変数の編集ダイアログボックスを閉じます。
    h。 [〜#〜] ok [〜#〜]をクリックして、Environment Variablesダイアログボックスを閉じます。
    私。 [〜#〜] ok [〜#〜]をクリックして、System Propertiesダイアログボックスを閉じます。
  13. ここで、任意の方法を使用してアプリケーションを起動します。 Visual Studioが起動し、アプリケーションがロードされます。

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

9
Hauke P.

プロセスがない場合、Visual Studioはattachできません。

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

3
ChrisF

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

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

(winformsを使用する場合)Formコンストラクタに追加できるため、コンポーネントの初期化を除き、これは他の何かの前に実行されます。

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

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

1
Raynet

多くの人に合うかもしれない小さなソリューション。

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

    System.Threading.Thread.Sleep(20000)

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

それほど多くの答えはありませんでしたが、私にとってはおやつになりました

1
user2728841