В VS2010, есть ли способ узнать, какой пул приложений обслуживает данный w3wp.exe, чтобы затем решить присоединить отладчик?

Поэтому я отлаживаю некоторые сайты (один из транка, один из филиала), работающие локально, в отдельных apppools. У меня есть магистральные и ответвительные решения, открытые в двух экземплярах VS. Я хотел бы отладить ствол в одном, и ответвление в другом. Я хотел бы знать, есть ли способ узнать, какой пул приложений обслуживает каждый w3wp.exe, чтобы узнать, какой из них какой при подключении отладчика.

Обновление: суть в том, чтобы написать макрос в VS, чтобы затем дать мне кнопку (для интересующего пула приложений), к которой можно будет кликнуть, чтобы присоединить отладчик. Поэтому решения предпочтительно не должны включать другие программы.

Обновление 2: это на Windows 7 против IIS7.

5 ответов

Решение

Другим вариантом может быть WADA - W3WP Advanced Attacher, доступный в галерее Visual Studio. Я нашел это, выполнив поиск в онлайн-галерее Extension Manager для "прикрепить работника".

Ниже мой основной макрос. Напишите несколько однолинейных подписчиков, называя это, как AttachToW3wp("DefaultAppPool") называя каждый пул приложений, который вас интересует, и создавайте для них кнопки и горячие клавиши.

    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

Посмотрите на ответы на этот вопрос. Для этого есть встроенные скрипты, которые вы можете запустить из командного окна.

Если вы можете выполнить запрос в каждой ветви, вы могли бы использовать что-то вроде Process Explorer или Task Manager, чтобы увидеть, какой идентификатор, который, возможно, занимает процессор, который в данный момент обрабатывает запрос, предполагая, что вы можете получить такое разделение.

Вы можете использовать диспетчер задач для просмотра имени пользователя, под которым выполняется процесс (который в общем случае совпадает с именем пула приложений) и идентификатора процесса, но вы должны включить эти столбцы в диспетчере задач, а также процесс Имя должно совпадать с пулом приложений (насколько я знаю, это по умолчанию).
Также обратите внимание, что все методы, перечисленные на этой странице, могут отображать только те процессы, которые выполняются в данный момент, а это означает, что если ваш конкретный процесс завершил работу из-за простоя, вы должны сначала использовать сайт, чтобы вывести процесс в список, а в вашем случае это означает, что вы должны сначала получить доступ ко всем сайтам, чтобы убедиться, что процесс, связанный с ними, запущен.

Другие вопросы по тегам