6

私は通常、Webアプリケーションを開発しています。驚くほど大量の作業時間が「Ctrl + Alt + P」、プロセス名で並べ替え、w3wp.exeでデバッガをアタッチするのに費やされます。どのように私はw3wp.exeのすべてのインスタンスにデバッガを接続するVisual Studioマクロを作ることができますか?

私は通常いくつかのアプリケーションプールにまたがるアプリケーションに取り組んでいるので、通常は2〜3インスタンスのw3wp.exeがあります。どのアプリケーションを接続するのかは分かりません。彼らはすべて、過剰殺害ですが、動作します。すべてのすべてで

が、これはかなり面倒です...

私の同僚が(彼は基本的にこれを記録)を自動的にw3wp.exeに添付するVSマクロを持ってする方法を考え出し:

Sub AttachMacro()  
    Try  
    Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger  
    Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default")  
    Dim dbgeng(3) As EnvDTE80.Engine  
    dbgeng(0) = trans.Engines.Item("T-SQL")  
    dbgeng(1) = trans.Engines.Item("T-SQL")  
    dbgeng(2) = trans.Engines.Item("Managed")  
    Dim proc2 As EnvDTE80.Process2 = dbg2.GetProcesses(trans, "ENIAC").Item("w3wp.exe")  
    proc2.Attach2(dbgeng)  
    Catch ex As System.Exception  
    MsgBox(ex.Message)  
    End Try  
End Sub 

私は本当に必要なものか、何か、私はVSのマクロを作ったことがないのかどうかは分かりません。どこから始めるのか本当に分かりません。

ではなくへのw3wp.exeのインスタンスを自分自身を添付の、それはにw3wp.exeのすべてののインスタンスを自分自身を添付するように、このマクロを変更する方法はありますか?

+0

この機能は、Visual Studioの一部である必要があります。誰でもConnectの問題を作りたい、あるいは既存のものをチェックしたいですか? –

答えて

8
Sub MacroAttachToAllProcesses() 

    Try 

     Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger 
     Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default") 
     Dim dbgeng(3) As EnvDTE80.Engine 

     dbgeng(0) = trans.Engines.Item("T-SQL") 
     dbgeng(1) = trans.Engines.Item("T-SQL") 
     dbgeng(2) = trans.Engines.Item("Managed") 

     For Each theProcess As EnvDTE80.Process2 In dbg2.GetProcesses(trans, "COMPUTERNAME") 
      If theProcess.Name.Contains("w3wp.exe") Then 
       theProcess.Attach2(dbgeng) 
      End If 

     Next 

    Catch ex As System.Exception 
     MsgBox(ex.Message) 
    End Try 

End Sub 
+0

ツールバーに割り当てる...下にスクロールこの投稿の投稿:http://www.milkcarton.com/blog/2007/05/20/Using+Visual+Studio+Macros+To+Increase+Productivity.aspx –

+0

このブログのURLが変更されたと考えられていますあなたは私のようにそれを見つける必要はありませんので、更新。 http://www.milkcarton.com/blog/default,month,2007-05.aspx – Cragly

+2

ComputerNameの代わりに 'System.Environment.MachineName'を使用 – Jeremy

0

gflags.exeをご覧ください。そのオプションの1つは、特定の実行可能ファイルを呼び出すたびに実行されるデバッガです。

+0

私はそれがうまくいくかどうかは確信していません... それは何をするつもりですか? w3wp.exeを実行するたびにVisual Studioの新しいインスタンスを開きますか? 同じVSインスタンスに複数のw3wp.exeプロセスが接続されている必要があり、プロジェクトがロードされているインスタンスにする必要があります... –

1

私はあなたがこのタスクのマクロを探していることを知っています。同様のマクロがあります。しかし、デバッグを開始するときに、ソリューション内のプロジェクトにデバッガを接続する方法について説明したいと思います。

少し知られている機能です。ソリューションブラウザでソリューションファイルを右クリックしてプロパティを選択すると、複数のスタートアッププロジェクトとそのアクションを定義できます。デバッガは、実行時にリストされたプロジェクトにアタッチされます。

注:Webサービスがある場合、ブラウザウィンドウが開きますが、プロジェクトのプロパティでは、ウィンドウを開かないように指示することで無効にできます。

1

これは私がリモートw3wpプロセスに接続する方法です。 DanCのソリューションよりも少し早く実行され、エラー処理が余分に行われます。

Private Sub AttachToW3wp(ByVal machineName As String) 
    ' In order for this to work, you have to be running the Visual Studio 2010 Remote Debugging Monitor 
    ' as your (domain) user. 
    ' It won't work if the remote debugger is running as a service. I've tried every permutation of 
    ' domain and username in the the transport qualifier, tried the obvious local system username, 
    ' even tried looking at the network traffic 
    ' in WireShark, I can't figure it out how to make it work if you are running as a service. 
    ' If you are running the debugger as a service, even running the macro that gets created by VS's 
    ' macro recorder when you attach to a process doesn't work. 
    Dim transportQualifier = machineName 
    Try 
     Dim processToAttachTo As String = "w3wp.exe" 
     Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger 
     Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default") 
     Dim dbgeng(2) As EnvDTE80.Engine 
     dbgeng(0) = trans.Engines.Item("T-SQL") 
     dbgeng(1) = trans.Engines.Item("Managed (v2.0, v1.1, v1.0)") 
     Dim processesRemote = dbg2.GetProcesses(trans, transportQualifier) 
     Dim attached As Boolean = False 
     Dim processRemote As EnvDTE80.Process2 
     For Each processRemote In processesRemote 
      ' For some reason it takes a much longer time to get the remote process names then it 
      ' does the user name, so let's skip over all the processes that have the wrong UserName. 
      If processRemote.UserName = "NETWORK SERVICE" AndAlso _ 
       (Right(processRemote.Name, Len(processToAttachTo)) = processToAttachTo) Then 
       If processRemote.IsBeingDebugged Then 
        MsgBox(processToAttachTo & " on " & machineName & " is already being debugged") 
       Else 
        processRemote.Attach2(dbgeng) 
       End If 
       attached = True 
      End If 
     Next 
     If Not attached Then 
      MsgBox(processToAttachTo & " is not running on " & machineName & ".") 
     End If 
    Catch ex As System.Exception 
     MsgBox("Exception attempting to attach to " & transportQualifier & ": " & ex.Message) 
    End Try 
End Sub 
関連する問題