2009-09-26 13 views
16

起動時にすぐに失敗し、エラーメッセージやログなしで存在する.NETアプリケーションをデバッグしたいと思いますが、実行した直後にプロセスが存在するため、デバッガをアタッチできません。私はアプリのソースコードを持っていないので、私は "デバッグを開始"することはできません。私は、プロセスを開始し、それに接続し、破るためにVisual Studioのマクロを使用してみましたが、マクロが遅すぎると、それはプロセスを見つけるまでに、プロセスがすでに終了しました:プロセスの作成時にデバッガを接続する方法は?

Imports System 
Imports EnvDTE80 
Imports EnvDTE90 
Imports System.Diagnostics 

Public Module Module1 
    Sub RunAndAttach() 
     Try 
      Dim dbg As Debugger3 = DTE.Debugger 
      Dim trans As Transport = dbg.Transports.Item("Default") 
      Dim sysProc As Process = System.Diagnostics.Process.Start(New ProcessStartInfo("C:\Temp\CrashingApp.exe") With {.WorkingDirectory = "C:\Temp"}) 
      Dim proc As EnvDTE90.Process3 = dbg.GetProcesses(trans, "ALLON-PC").Item("CrashingApp.exe") 
      If (Not sysProc.HasExited) Then 
       proc.Attach() 
       proc.Break(False) 
      Else 
       MsgBox("Process " + proc.Name + " has already has exited.") 
      End If 
     Catch ex As System.Exception 
      MsgBox(ex.Message) 
     End Try 
    End Sub 

End Module 

ありますF5のように、新しく作成されたプロセスにデバッガを接続する方法はありますか?

ありがとうございます!

答えて

20
  1. 新しいプロジェクトを作成します(コンソールプロジェクトは正常です)。
  2. プロジェクトを右クリックし、[プロパティ]を選択します。
  3. [デバッグ]タブをクリックします。
  4. 「外部プログラムを開始:」を選択してください。
  5. プログラムを選択してください。
  6. ヒットF5。
+1

素敵なトリック!私の場合、F5を押すとプログラムが実行され、すぐに終了します。代わりに、Step Intoを使用すると、Main()の先頭でブレークが発生しました。ありがとう! –

1
  1. windbgから処理を開始できます。
  2. reflectorを使用すると、逆コンパイルしてソースを取得し、そこから続けることができます。

もう1つのアイデアは、プロセスが何をしようとしているかを確認するためにprocess monitorを使用することです。失敗はおそらく何らかの外的なものへの依存によって引き起こされます。そして、プロセスモニタを使用してその場所を特定することができます。

更新:リフレクタFileDisassemblerアドインを使用して、完全なソリューションを作成し、そこからデバッグすることができます。

+0

プロセスモニタ:試してみました。失敗はありません。一部の内部ロジックは、終了を決定します。例えば。 ProcMonは起動時のアプリケーションが土曜日の場合には終了しません。 Reflector:アプリケーションP /管理されていないDLLを呼び出し、管理されたデバッガをアタッチできないため、その内容を表示できないローカル変数に結果を格納します。 –

+0

また、リフレクタについて - 逆アセンブリからソリューションを再作成したい場合は、アセンブリ全体を逆コンパイルしてすべてのソースファイルをディスクに保存するにはどうすればよいですか?または、手動で各クラスとメソッドをコピー/ペーストする必要がありますか? –

+0

FileDisassembler Reflectorプラグインはとても役に立ちました。ありがとうございました!私がplugnisフォルダにいる間、私はDeblector、残念なことにあまり役に立たなかったデバッグプラグイン、そしてReflexilに注意しました。これはMSIL命令を注入できるようにします。私はMessageBox.Show( "Attach now。")をMain()の最初のステートメントとして注入しました。これはデバッガを接続するのに必要な時間をあなたに与えます(OKを押すまで)。もちろんJohnのメソッドは優れています。 –

3

デバッガーは、接続する前にある程度の処理が必要です。たとえば、ASP.Netでは、IIS上の "Application_Start"イベントをデバッグするのは難しいです。これは早すぎるためです。アプリケーションを起動してからデバッガをアタッチする必要があります。

あなたはWindbgでプログラムを実行することができ、即時ブレークまたはメモリダンプを取得できます。 great tutorial on setting up windbg hereがあり、記事のコメントの中には、windbgから.exeを実行して即時にダンプする方法についての説明があります。

+4

Application_Startをデバッグするには、Visual Studio内のWebアプリケーションをスタートアッププロジェクトとして設定するか、Application_Start内にDebugger.Break()を入れてから、デバッグダイアログにヒットしたときにアタッチします。 – adrianbanks

+0

Debugger.Break()のポイントが良いです。 – womp

+0

私はソースコードを持っていないので、どちらもオプションではありません。私はwindbgしようとします。 windbgが接続されているプロセスをVSでデバッグすることはできますか?そうでない場合、windbgは、管理されたアセンブリ(ローカル変数ウォッチ、コールスタックなど)のデバッグにどのくらい便利ですか? –

0

"File \ Open \ Project/Solution"を実行し、 "ソリューション"として.exeを選択してから、F5キーを押してください。

+0

すでにそれを試みました。開く>プロジェクト/ソリューションではEXEを開くことができず、Open> Fileはそのファイル内のリソースを表示するだけですが、デバッグはできません。 –

+0

それは私のために働く、hm。 – Brian

+0

Visual Studioのどのバージョンを使用していますか? –

関連する問題