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!
źródło
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.
źródło
Wykonaj następujące kroki, jeśli masz program Visual Studio 2017-2019:
O wiele łatwiejsze niż inne sugestie: nie musisz majstrować przy właściwościach projektu i nie są potrzebne żadne rozszerzenia.
źródło
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:
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 .
debugger
.vsjitdebugger.exe
.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 .
Mam nadzieję, że to pomoże komukolwiek innemu w przyszłości!
źródło
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.
źródło
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ć:
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:
Po zakończeniu debugowania zakomentuj tę linię.
źródło
Możesz uruchomić debuger z kodu za pośrednictwem
Ale nie usuwaj tego wiersza przed wysłaniem aplikacji. Może chcesz użyć flag kompilatora, aby mieć pewność:
źródło
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: -)
źródło