2010-10-05 9 views
6

Mam aplikację, która działa hostowana w ramach procesu "w3wp.exe"."Dołącz do procesu" jako zdarzenie typu "post-build"

podczas debugowania, często znajduję się następujące kroki:

1 - wprowadzić pewne zmiany

2 - zbudować projekt

3 - dołączyć do "w3wp.exe" za pomocą polecenia „Dołącz do przetworzenia "okna dialogowego w menu Narzędzia.

4 - wykonać pewne działania w aplikacji, aby wykonać mój kod, więc mogę przejść przez nią w debugger

Chciałbym zautomatyzować krok 3 w skrypcie post-build tak, że IDE automatycznie dołącza się do procesu po zakończeniu kompilacji. Zauważ, że już uruchamiam aplikację jako część procesu późniejszego budowania, więc mogę liczyć na proces istniejący w tym momencie.

Czy ktoś zna sposób automatyzacji polecenia "dołącz do procesu"? Coś z wiersza poleceń byłoby szczególnie miłe, ale zrobi to też makro.

Używam Visual Studio 2008 w Windows 7, 64-bitowy.

Edit @InSane zasadzie dał mi właściwą odpowiedź, ale to nie działa, ponieważ muszę debugowania kodu zarządzanego, zamiast natywnego kodu. Wygląda na to, że vsjitdebugger domyślnie przyjmuje kod natywny, a zatem mój punkt przerwania nie zostanie trafiony. Z poziomu IDE mogę określić "zarządzany kod", a debugger jest podłączony zgodnie z oczekiwaniami. Czy istnieje jakiś sposób, aby wskazać vsjitdebugger do zarządzanego kodu?

Odpowiedz

6

I w końcu udało się rozwiązać ten problem na przykładzie mogę znaleźć gdzie indziej w Internecie. Dzielę się tym tutaj, ponieważ było to dla mnie pomocne.

1 - Utwórz nową aplikację wiersza poleceń z poniższym kodem (ten przykład znajduje się w 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 - Otworzyć rozwiązanie chcesz debugować w Visual Studio

3 - Na koniec waszych "post-build" zdarzeń, wprowadź wezwanie do tego nowego narzędzia, jak w:

c:\AutoAttach.exe w3wp.exe 20000 

4 - Budowanie aplikacji

+2

musimy zaktualizować ciąg "VisualStudio.DTE.9.0" dla odpowiedniej wersji studyjnej visual. Dla VisualStudio2012 będzie to "VisualStudio.DTE.11.0" – NavaRajan

+0

Dla Visual Studio 2015 będzie to "VisualStudio.DTE.14.0" – bluray

2

Możesz wypróbować następujące polecenie z wiersza poleceń systemu Windows.

Jeśli działa zgodnie z oczekiwaniami, możesz umieścić go jako część swoich postbuildów.

ProcessID to identyfikator uruchomionego procesu, do którego chcesz się podłączyć.

vsjitdebugger.exe -p ProcessId 

Inne opcje dotyczące korzystania z wiersza poleceń to: - alt text

+0

Awansuj na świetną sugestię, ale nie działa. Jeśli użyję tego polecenia, zapyta mnie, czy chcę użyć bieżącego debuggera, czy uruchomić nowy. Wybieram bieżący i wydaje mi się, że jest to trochę trudne, ale wtedy każdy punkt przerwania, który ustawiłem, zawiera: "Punkt przerwania nie zostanie aktualnie trafiony. Żaden symbol nie został załadowany dla tego dokumentu." Jeśli ręcznie wybiorę ten sam proces z poziomu IDE, punkt przerwania zostanie poprawnie skonfigurowany. Jakieś pomysły? – JosephStyons

+0

@JosephStyons - Nie jestem pewien, czy to zadziała, ale czy możliwe jest wcześniejsze określenie folderu symboli debugowania w VS -> Opcje -> Debugowanie -> Symbole -> Lokalizacja plików symboli ->. To może pomóc debuggerowi wiedzieć, gdzie szukać symboli ... – InSane

+0

ten sam problem, robię ze skryptem powershell wykonanym w zdarzeniu budowania postów i proszą mnie o użycie bieżącego debugera lub nowego, ale potem hitpoint jest bez ucisku. –

0

Tutaj jest ulepszona wersja Józefa. Dodałem to: -dont show console (Ustaw na swoim projekcie w "Application" typ wyjścia na "Windows Application".) - ustawiono argument wiersza poleceń limitu czasu na 0 (dlaczego w ogóle jest potrzebny?) - dodano trzeci adres wiersza polecenia wiersza poleceń, który jest uruchamiany z firefox, ale tylko po wczytaniu strony najpierw w programie. dzieje się tak, ponieważ niektóre witryny, szczególnie dotnetnuke, zajmują dużo czasu po wczytaniu. więc w ten sposób Firefox zaprowadzi Cię do przedpremierowej przeglądarki Firefox dopiero po tym, jak wszystko będzie gotowe do przetestowania, zajmuje to do 1 minuty na moim komputerze. możesz pracować nad czymś innym w międzyczasie. PS. ten edytor stackoverflow jest trochę głupi. to dlatego ten tekst nie jest dość sformatowany. jeśli dodam poniższy kod biuletynów, nie pokazuję się jako kod.

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 
+0

To nie działa ze mnie. Używając VS2015, czy to może być powód? Zasadniczo użyj zdarzeń kompilacji, aby uruchomić program, a następnie ten program, aby "dołączyć". Dodałem BP do mojego głównego projektu, ale to nie jest hit. Mogę to zrobić ręcznie bez problemu. – AbstractDissonance

1

Oto funkcja PowerShell inspirowana odpowiedzią @ JosephStyons. Działa z dowolną wersją VS bez zmian.

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+).*', '$1' 
    $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() 
}