"Присоединить к процессу" как событие после сборки
У меня есть приложение, которое работает под "w3wp.процесс exe".
во время отладки я часто выполняю следующие шаги:
1 - внести некоторые изменения
2 - построить проект
3-присоединить к " w3wp.exe "с помощью диалогового окна" прикрепить к процессу "в меню "Сервис".
4-выполните некоторые действия в приложении, чтобы выполнить мой код, чтобы я мог пройти через него в отладчике
Я хотел бы автоматизируйте Шаг 3 в сценарии после сборки, чтобы среда IDE автоматически подключалась к процессу после завершения сборки. Обратите внимание, что я уже запускаю приложение как часть процесса после сборки, поэтому я могу рассчитывать на процесс, существующий на данный момент.
кто-нибудь знает способ автоматизации команды "прикрепить к процессу"? Что-то из командной строки было бы особенно хорошо, но макрос тоже подойдет.
Я использую Visual Studio 2008 под Windows 7, 64 немного.
редактировать @InSane в основном дал мне правильный ответ, но он не работает, потому что мне нужно отлаживать управляемый код, а не собственный код. Кажется, что vsjitdebugger по умолчанию использует собственный код, и поэтому моя точка останова не попадает. Изнутри IDE я могу указать "управляемый код", и отладчик подключается, как ожидалось. Итак, есть ли способ указать vsjitdebugger на управляемый код?
4 ответов
Я, наконец, смог решить эту проблему с примером, который я нашел в другом месте в интернете. Я разделяю его здесь, так как это было полезно для меня.
1-Создайте новое приложение командной строки с приведенным ниже кодом (этот пример находится в VB.NET).
Option Strict Off
Option Explicit Off
Imports System
'On my machine, these EnvDTE* assemblies were here:
'C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\PublicAssemblies
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Imports System.Threading
Module modMain
Function AttachToProcess(ByVal processName As String, _
ByVal Timeout As Integer) As Boolean
Dim proc As EnvDTE.Process
Dim attached As Boolean
Dim DTE2 As EnvDTE80.DTE2
Try
DTE2 = _
System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.9.0")
For Each proc In DTE2.Debugger.LocalProcesses
If (Right(proc.Name, Len(processName)).ToUpper = processName.ToUpper) Then
proc.Attach()
System.Threading.Thread.Sleep(Timeout)
attached = True
End If
Next
Catch Ex As Exception
Console.Write("Unable to Attach to Debugger : " & Ex.Message)
End Try
Return attached
End Function
Sub Main()
'to call w/ Command Line arguments follow this syntax
'AttachProcess <<ProcessName>> <<TimeOut>>
'AttachProcess app.exe 2000
Dim AppName As String = "w3wp.exe"
Dim TimeOut As Integer = 20000 '20 Seconds
Try
If Environment.GetCommandLineArgs().Length > 1 Then
AppName = Environment.GetCommandLineArgs(1)
End If
If Environment.GetCommandLineArgs().Length > 2 Then
If IsNumeric(Environment.GetCommandLineArgs(2)) Then
TimeOut = Environment.GetCommandLineArgs(2)
End If
End If
Environment.GetCommandLineArgs()
AttachToProcess(AppName, TimeOut)
Console.WriteLine("Attached!!")
Catch Ex As Exception
Console.Write("Unable to Attach to Debugger : " & Ex.Message)
End Try
End Sub
End Module
2-Откройте решение, которое требуется отладить в Visual Studio
3-в конце событий "после сборки" введите вызов этой новой утилиты, как в:
c:\AutoAttach.exe w3wp.exe 20000
4-Создайте свой применение
вы можете попробовать следующую команду из командной строки Windows.
если он работает так, как вы ожидаете, вы можете поместить его как часть ваших шагов postbuild.
ProcessID-это идентификатор запущенного процесса, к которому вы хотите подключиться.
vsjitdebugger.exe -p ProcessId
другие параметры для использования этого из командной строки включают :-
вот функция PowerShell, вдохновленная ответом @JosephStyons. Работает с любой версией VS без изменений.
function Debug-ProcessVS([int] $processId)
{
$vsProcess = Get-Process devenv | Select-Object -First 1
if (!$vsProcess) {throw "Visual Studio is not running"}
$vsMajorVersion = $vsProcess.FileVersion -replace '^(\d+).*', ''
$dte = [System.Runtime.InteropServices.Marshal]::GetActiveObject("VisualStudio.DTE.$vsMajorVersion.0")
$debugee = $dte.Debugger.LocalProcesses | ? {$_.ProcessID -eq $processId}
if (!$debugee) {throw "Process with ID $processId does not exist."}
$debugee.Attach()
}
вот улучшенная версия Джозефа. Я добавил Это: - не показывать консоль (установите в своем проекте в" Application "тип вывода на "Windows Application".) - я установил аргумент командной строки timeout в 0 (зачем это вообще нужно?) - добавлена третья командная строка ARG url, которая запускается с firefox, но только после того, как сайт сначала загружается внутри программы. это связано с тем, что некоторые сайты, особенно dotnetnuke, занимают много времени для загрузки после компиляции. таким образом, firefox выведет вас на передний план браузер firefox только после того, как все готово к тестированию, занимает до 1 минуты на моем компьютере. а пока можешь поработать над чем-нибудь другим. ПС. этот редактор stackoverflow немного глуп. вот почему этот текст не отформатирован красиво. если я добавлю список бюллетеней, код ниже не будет отображаться как код.
Option Strict Off
Option Explicit Off
Imports System
'On my machine, these EnvDTE* assemblies were here:
'C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\PublicAssemblies
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Imports System.Threading
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Net
Module modMain
Function AttachToProcess(ByVal processName As String, _
ByVal Timeout As Integer) As Boolean
Dim proc As EnvDTE.Process
Dim attached As Boolean
Dim DTE2 As EnvDTE80.DTE2
Try
DTE2 = _
System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.11.0")
For Each proc In DTE2.Debugger.LocalProcesses
If (Right(proc.Name, Len(processName)).ToUpper = processName.ToUpper) Then
proc.Attach()
System.Threading.Thread.Sleep(Timeout)
attached = True
Exit For
End If
Next
Catch Ex As Exception
Console.Write("Unable to Attach to Debugger : " & Ex.Message)
End Try
Return attached
End Function
Sub Main()
'to call w/ Command Line arguments follow this syntax
'AttachProcess <<ProcessName>> <<TimeOut>>
'AttachProcess app.exe 2000
Dim AppName As String = "w3wp.exe"
Dim TimeOut As Integer = 20000 '20 Seconds
Dim Url As String = "http://www.dnndev.me/"
Try
If Environment.GetCommandLineArgs().Length > 1 Then
AppName = Environment.GetCommandLineArgs(1)
End If
If Environment.GetCommandLineArgs().Length > 2 Then
If IsNumeric(Environment.GetCommandLineArgs(2)) Then
TimeOut = Environment.GetCommandLineArgs(2)
End If
End If
If Environment.GetCommandLineArgs().Length > 3 Then
Url = Environment.GetCommandLineArgs(3)
End If
Environment.GetCommandLineArgs()
AttachToProcess(AppName, TimeOut)
'Console.WriteLine("Attached!!")
'load site for faster opening later
Using client = New WebClient()
Dim contents = client.DownloadString(Url)
End Using
'open site in firefox
Dim ExternalProcess As New System.Diagnostics.Process()
ExternalProcess.StartInfo.FileName = "c:\Program Files (x86)\Mozilla Firefox\firefox.exe"
ExternalProcess.StartInfo.WindowStyle = ProcessWindowStyle.Minimized
ExternalProcess.StartInfo.Arguments = "-url " & Url
ExternalProcess.Start()
'ExternalProcess.WaitForExit()
Catch Ex As Exception
Console.Write("Unable to Attach to Debugger : " & Ex.Message)
End Try
End Sub
End Module