VS2010では、特定のw3wp.exeがどのアプリケーションプールにサービスを提供しているかを知り、デバッガをアタッチすることを決定する方法はありますか?

debugging process visual-studio-2010 w3wp
VS2010では、特定のw3wp.exeがどのアプリケーションプールにサービスを提供しているかを知り、デバッガをアタッチすることを決定する方法はありますか?

そこで、別々のアプリプールでローカルに実行されているいくつかのWebサイト(1つはトランクから、もう1つはブランチから)をデバッグしています。 2つのVSインスタンスでトランクおよびブランチソリューションを開いています。 一方のトランクをデバッグし、もう一方のブランチをデバッグしたいと思います。 各w3wp.exeが提供しているアプリケーションプールを知る方法があるかどうか、デバッガをアタッチするときにどのプールがどれかを知る方法があるかどうかを知りたいです。

更新:この点は、VS内にマクロを記述して、デバッガーをアタッチするためにクリックできるボタン(興味深いアプリプールごと)を作成できるようにすることです。 そのため、ソリューションには他のプログラムを含めることはできません。

Update2:これは、IIS7に対するWindows 7上です。

  1  2


ベストアンサー

以下は私のコアマクロです。 「AttachToW3wp( “DefaultAppPool”)」のように、それを呼び出す1行のサブコードをいくつか作成して、関心のある各アプリプールに名前を付け、ボタンとホットキーを作成します。

    Private Sub AttachToW3wp(ByVal appPoolName As String)
    Const processName As String = "w3wp.exe"
    Dim userName As String = String.Format("IIS APPPOOL\{0}", appPoolName)

    Try
        Dim debugger As EnvDTE90.Debugger3 = CType(DTE.Debugger, EnvDTE90.Debugger3)
        'debugger.DetachAll()

        Dim transport As EnvDTE80.Transport = debugger.Transports.Item("Default")
        Dim qualifier As String = Environment.MachineName '= My.Computer.Name
        Dim engines(3) As EnvDTE80.Engine
        engines(0) = transport.Engines.Item("Managed")
        engines(1) = transport.Engines.Item("Script")
        engines(2) = transport.Engines.Item("T-SQL")

        Dim successMessage As String = String.Empty
        For Each process As EnvDTE80.Process2 In debugger.GetProcesses(transport, qualifier)
            With process
                Dim fi As New System.IO.FileInfo(.Name)
                If fi.Name = processName AndAlso (String.Compare(.UserName, 0, userName, 0, Len(userName), True) = 0) Then
                    If .IsBeingDebugged Then Throw New Exception(String.Format("{0} {1} is already attached to a debugger.", processName, userName))

                    process.Attach2(engines)
                    successMessage = String.Format("Attached to {0} for {1} ({2})", processName, userName, .ProcessID)

                    Exit For
                End If
            End With
        Next

        If successMessage = String.Empty Then
            Throw New Exception(String.Format("{0} {1} not found.", processName, userName))
        Else
            Trace.WriteLine(successMessage)
        End If

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

4


このhttps://stackoverflow.com/questions/748927/iis-application-pool-pid[question]への回答をご覧ください。 これを行うために、コマンドウィンドウから実行できる組み込みのスクリプトがあります。

1


別のオプションは、http://visualstudiogallery.msdn.microsoft.com/7d740ee7-344a-4550-a272-b6de0071f42f [WADA
– Visual Studio Galleryで利用可能なW3WP Advanced Attacher]。 I
Extension Managerのオンラインギャラリーで「アタッチワーカー」を検索して見つけました。

1


各ブランチでリクエストを実行できる場合は、http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx [Process Explorer]またはタスクマネージャーなどを使用して、どのIDが1つであるかを確認できます。そのような分離を得ることができると仮定して、現在リクエストを処理しているCPUサイクルを占有している可能性があります。

0


タスクマネージャーを使用して、プロセスが実行されているユーザー名(通常はアプリケーションプール名と同じ)とプロセスIDを表示できますが、タスクマネージャーでこれらの列をオンにする必要があります。名前はアプリケーションプールと同じである必要があります(私の知る限りでは、これがデフォルトです)。 +また、このページにリストされているすべてのメソッドは、現在実行中のプロセスのみを表示する可能性があります。つまり、アイドル時間のために特定のプロセスがシャットダウンした場合、最初にサイトを使用してプロセスを起動する必要がありますあなたの場合、それはあなたがそれらに関連付けられたプロセスが実行されていることを確認するために最初にすべてのサイトにアクセスする必要があることを意味します。

-1


タイトルとURLをコピーしました