Jak dołączyć program Visual Studio do procesu, który nie został jeszcze uruchomiony?

89

Mam program .NET, którego nie można uruchomić z programu Visual Studio z pewnych powodów (plik Excel utworzony z projektu szablonu programu Excel 2010), dla którego muszę debugować zdarzenia startowe.

Jeśli chcę debugować zdarzenia, które pojawiają się po inicjalizacji programu, nie ma problemu. Uruchamiam program z eksploratora, dołączam proces do Visual Studio i dodaję kilka punktów przerwania w kodzie. Ale tutaj muszę umieścić punkty przerwania w zdarzeniach startowych. Muszę mieć możliwość dołączania procesów do programu Visual Studio, nie zależnie od PID, ale od określonej nazwy procesu lub innego rozwiązania, które będzie działać.

Oczywiście nie ma mowy o dodaniu a Thread.Sleep(1000)do moich zdarzeń startowych, aby dać mi trochę czasu na dołączenie procesu do programu Visual Studio!

Ucodia
źródło

Odpowiedzi:

97

Właściwie możesz; nie przywiązujesz się do tego, zaczynasz to. We właściwościach projektu, na karcie Debugowanie, w polu tekstowym „Polecenie” określ ścieżkę programu, do którego chcesz dołączyć.

W polu „Argumenty polecenia” można również wprowadzić dowolne argumenty wiersza polecenia dla programu:

wprowadź opis obrazu tutaj

Upewnij się, że „Dołącz” jest ustawione na „Nie”.

Tibi
źródło
6
Dobre rozwiązanie, ale zwróć uwagę, że naciśnięcie klawisza F5 nie działa w tym przypadku. Zamiast tego kliknij prawym przyciskiem myszy odpowiedni projekt i kliknij „Debuguj> Uruchom nową instancję” z menu kontekstowego.
Herman Cordes
1
Aby klawisz F5 działał, projekt musi być projektem początkowym w rozwiązaniu. Aby to zrobić, w eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt i wybierz „Ustaw jako projekt startowy”.
Tibi
1
Także jeśli twój program ma jakieś zewnętrzne zależności, musisz również zmienić "Katalog roboczy".
Priyank
Może być wymagane zaznaczenie opcji „Włącz debugowanie kodu natywnego” (właściwości projektu → DebugujWłącz debugery ).
Peter Mortensen
Jak to zrobić dla całego rozwiązania z 40 projektami?
Tony Tannous,
23

Debugowałem wtyczkę C ++ w zewnętrznym procesie, który się zawiesił, rzucając wyjątek podczas uruchamiania i to działało idealnie dla mnie:

Dodaj bezpłatne rozszerzenie Reattach dla programu Visual Studio . Poproś go o ponowne podłączenie do nazwy procesu przed jego uruchomieniem. Pojawi się modalne okno dialogowe z informacją, że czeka na uruchomienie nazwy procesu.

Teraz uruchom proces, a debuger programu Visual Studio zostanie natychmiast dołączony, przechwytując wyjątki i uderzając w punkty przerwania.

mstrange
źródło
Tysiąc razy tak!
itslittlejohn
Mam impas. Żądał autoryzacji administratora, gdy mój cel został uruchomiony, a po wpisaniu pwd i ponownym uruchomieniu vs, Reattach zniknął. Tylko vs bez autoryzacji administratora zawiera Reattach.
Eric
2
Nie działa na mnie. Wciąż przyczepia się o wiele za późno, po zdarzeniu. Wydaje się, że co sekundę sprawdza istniejące procesy, co w przypadku tej aplikacji jest całkowicie bezcelowe.
riv
20

Wykonaj następujące kroki, jeśli masz program Visual Studio 2017-2019:

  1. Plik> Otwórz> Projekt / rozwiązanie
  2. Wybierz swój plik .exe
  3. Debuguj> Rozpocznij debugowanie

O wiele łatwiejsze niż inne sugestie: nie musisz majstrować przy właściwościach projektu i nie są potrzebne żadne rozszerzenia.

Matt Thomas
źródło
Ale będziesz musiał powiedzieć programowi Visual Studio, gdzie są symbole debugowania, jeśli nie znajdzie ich automatycznie
Matt Thomas,
1
szybki łatwy do zrobienia w 5 sekund, uwielbiam to. Dzięki
towarzysz Joecool
1
Mój exe został uruchomiony, ale nie można ustawić punktu przerwania. Co powinienem zrobić?
Eric
2
@Eric Jeśli mój komentarz powyżej nie odnosi się do tego, polecam zadać to jako pytanie SO zamiast komentarza. Twój problem stanie się bardziej widoczny i będziesz mieć możliwość wyjaśnienia swojego konkretnego scenariusza. Daj nam znać, co znalazłeś!
Matt Thomas,
11

Tę odpowiedź znalazłem, gdy szukałem czegoś podobnego. W moim przypadku nie mogłem po prostu użyć pliku wykonywalnego jako programu startowego mojego projektu, ponieważ musiał on zostać uruchomiony w bardzo specyficznym środowisku, którego nie mogłem łatwo odtworzyć (czyli zacząłem od cygwin).

Przyjrzałem się rozszerzeniu Reattach zgodnie z sugestią mrstrange, a także bardzo podobnemu rozszerzeniu Attach To Anything ... ale mój plik wykonywalny wydawał się zamykać zbyt szybko, aby rozszerzenia mogły powiadamiać i dołączać.

Ostatecznie pomogło mi to: https://stackoverflow.com/a/4042545/1560865 , który odwołuje się do artykułu MSDN How to: Launch the Debugger Automatically , który z kolei zawiera następujące kroki:

  1. Uruchom Edytor rejestru (regedit).
  2. W Edytorze rejestru otwórz folder HKEY_LOCAL_MACHINE.
  3. Przejdź do opcji wykonania pliku HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ image.
  4. W folderze Image File Execution Options zlokalizuj nazwę aplikacji, którą chcesz debugować, na przykład myapp.exe . Jeśli nie możesz znaleźć aplikacji, którą chcesz debugować:
    a. Kliknij prawym przyciskiem myszy folder Image File Execution Options iw menu skrótów kliknij opcję New Key .
    b. Kliknij prawym przyciskiem myszy nowy klawisz iw menu skrótów kliknij polecenie Zmień nazwę . do. Zmień nazwę klucza na nazwę swojej aplikacji; W tym przykładzie myapp.exe .
  5. Kliknij prawym przyciskiem myszy folder myapp.exe iw menu skrótów kliknij polecenie Nowa wartość ciągu .
  6. Kliknij prawym przyciskiem myszy nową wartość ciągu iw menu skrótów kliknij polecenie Zmień nazwę.
  7. Zmień nazwę na debugger.
  8. Kliknij prawym przyciskiem myszy nową wartość ciągu iw menu skrótów kliknij polecenie Modyfikuj . Pojawi się okno dialogowe Edytuj ciąg .
  9. W polu Dane wartości wpisz vsjitdebugger.exe.
  10. Kliknij OK .
  11. W menu Rejestr kliknij Zakończ .
  12. Katalog zawierający vsjitdebugger.exe musi znajdować się w ścieżce systemowej. Aby dodać go do ścieżki systemowej, wykonaj następujące kroki:
    a. Otwórz Panel sterowania w widoku klasycznym i kliknij dwukrotnie opcję System .
    b. Kliknij opcję Zaawansowane ustawienia systemu .
    do. We Właściwościach systemu kliknij kartę Zaawansowane .
    re. Na karcie Zaawansowane kliknij opcję Zmienne środowiskowe .
    mi. W oknie dialogowym Zmienne środowiskowe w obszarze Zmienne systemowe wybierz opcję Ścieżka , a następnie kliknij przycisk Edytuj .
    fa. W Edytuj zmienną systemowąW oknie dialogowym dodaj katalog do pola Wartość zmiennej . Użyj średnika, aby oddzielić go od innych wpisów na liście.
    sol. Kliknij przycisk OK, aby zamknąć okno dialogowe Edytuj zmienną systemową .
    godz. Kliknij przycisk OK, aby zamknąć okno dialogowe Zmienne środowiskowe .
    ja. Kliknij OK, aby zamknąć okno dialogowe Właściwości systemu .
  13. Teraz użyj dowolnej metody, aby uruchomić aplikację. Visual Studio uruchomi się i załaduje aplikację.

Mam nadzieję, że to pomoże komukolwiek innemu w przyszłości!

Hauke ​​P.
źródło
3
Oto instrukcje dotyczące tego samego procesu w nowszych wersjach VS (do 2019 r.): Docs.microsoft.com/en-us/visualstudio/debugger/ ...
brichins
3

Jeśli nie ma procesu, program Visual Studio nie może się do niego dołączyć .

Możesz jednak ustawić program startowy projektu tak, aby był czymś innym niż wynik projektu.

ChrisF
źródło
Już zbadałem, czy to, co chcę zrobić, jest słuszne i tak jest. Moja sytuacja nie jest zwykłym przypadkiem debugowania programu Visual Studio. Mam projekt szablonu programu Excel 2010 opracowany w programie Visual Studio, a arkusze szablonów zawierają zdarzenia początkowe. Uruchamiam ten szablon z Visual Studio, dodaję dane w arkuszach Excela i zapisuję plik na dysku. Wtedy jedynym sposobem, w jaki mogę otworzyć ten plik, który również opiera się na zestawie szablonów, jest otwarcie go z eksploratora, dlatego nie mogę w tym przypadku debugować zdarzeń startowych i oczywiście mam pewne przetwarzanie danych podczas uruchamiania, takie jak wiązanie danych.
Ucodia
Może być wymagane zaznaczenie opcji „Włącz debugowanie kodu natywnego” (właściwości projektu → DebugujWłącz debugery ).
Peter Mortensen
3

Możesz wyświetlić MessageBox, spowoduje to zablokowanie aplikacji, następnie dołączasz lub ponownie podłączasz debugger do procesu i kliknij OK, aby kontynuować:

MessageBox.Show("Attach process to debugger and click ok!");

możesz dodać go do konstruktora Form (jeśli używasz winforms), więc zostanie to wykonane przed czymkolwiek innym, z wyjątkiem inicjalizacji komponentów:

public MainForm()
{
    InitializeComponent();
    MessageBox.Show("Attach process to debugger and click ok!");
}

Po zakończeniu debugowania zakomentuj tę linię.

Raynet
źródło
3

Możesz uruchomić debuger z kodu za pośrednictwem

public static void Main(string[] args)
{
  System.Diagnostics.Debugger.Launch();
}

Ale nie usuwaj tego wiersza przed wysłaniem aplikacji. Może chcesz użyć flag kompilatora, aby mieć pewność:

    public static void Main(string[] args)
    {
      #if debug
      System.Diagnostics.Debugger.Launch();
      #endif
    }
Ktoś
źródło
2
To powinna być akceptowana odpowiedź we wszystkich przypadkach, w których czekasz na jakiś zewnętrzny proces, aby uruchomić aplikację.
TravelingFox
2

Jedno małe rozwiązanie, które może pasować wielu osobom.

  • w pierwszym wierszu kodu, który będzie uruchamiany przez exe, dodaj to polecenie

    System.Threading.Thread.Sleep (20000)

To sprawi, że exe będzie spać przez 20 sekund, zanim zacznie cokolwiek przetwarzać. Następnie masz 20 sekund na dołączenie do procesu, co można zrobić szybko za pomocą ctrl + alt + p, a następnie znajdź proces, a następnie wprowadź, aby dołączyć.

Niewielka odpowiedź, ale zadziałała dla mnie: -)

user2728841
źródło
Musiałem debugować CGI napisane w "C", dla którego miałem kod źródłowy. Byłem prostym i łatwym rozwiązaniem, aby mieć czas na zajęcie się procesem w tle.
Joël Hecht