Come si collega Visual Studio a un processo non ancora avviato?


91

Ho un programma .NET che non può essere eseguito da Visual Studio per alcuni motivi (file Excel creato da un progetto modello Excel 2010) per cui devo eseguire il debug degli eventi di avvio.

Se voglio eseguire il debug di eventi che vengono dopo l'inizializzazione del programma non ci sono problemi. Eseguo il programma dall'explorer, allego il processo a Visual Studio e aggiungo alcuni punti di interruzione nel codice. Ma qui, ho bisogno di inserire punti di interruzione negli eventi di avvio. Devo essere in grado di collegare processi a Visual Studio, non in base a un PID, ma a un nome di processo specifico o qualsiasi altra soluzione che funzioni.

Ovviamente l'aggiunta di un Thread.Sleep(1000)nei miei eventi di avvio per darmi un po 'di tempo per allegare il processo in Visual Studio è fuori questione!

Risposte:


99

In realtà puoi; non ci si attacca, lo si avvia. Nelle proprietà del tuo progetto, nella scheda Debug, specifica il percorso del programma a cui vuoi collegarti nella casella di testo "Comando".

Puoi anche inserire qualsiasi argomento della riga di comando per il programma nella casella "Argomenti del comando":

inserisci qui la descrizione dell'immagine

Assicurati che "Allega" sia impostato su "No".


6
Buona soluzione, ma tieni presente che premere F5 non funziona in questo caso. Fare invece clic con il pulsante destro del mouse sul progetto in questione e fare clic su "Debug> Avvia nuova istanza" dal menu contestuale.
Herman Cordes

2
Affinché F5 funzioni, il progetto deve essere il progetto iniziale nella soluzione. Per farlo, in Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare "Imposta come progetto di avvio".
Tibi

1
Inoltre, se il tuo programma ha delle dipendenze esterne, devi cambiare anche "Directory di lavoro".
Priyank

Potrebbe essere necessario selezionare "Abilita debug del codice nativo" (proprietà del progetto → DebugAbilita debugger ).
Peter Mortensen

E come si fa per un'intera soluzione con 40 progetti?
Tony Tannous

23

Stavo eseguendo il debug di un plug-in C ++ in un processo generato esternamente che si è bloccato generando un'eccezione all'avvio e questo ha funzionato perfettamente per me:

Aggiungi l' estensione Reattach gratuita per Visual Studio . Chiedigli di ricollegarsi al nome del processo prima che venga avviato. Apparirà una finestra di dialogo modale che dice che è in attesa dell'avvio del nome del processo.

Ora avvia il processo e il debugger di Visual Studio si collegherà immediatamente, rilevando le eccezioni e raggiungendo i punti di interruzione.


Mille volte sì!
itslittlejohn

Ho una situazione di stallo. Ha richiesto l'autenticazione dell'amministratore quando il mio obiettivo è stato avviato e, dopo aver digitato pwd e riavviato vs, Reattach non c'era più. Solo vs senza autorizzazione amministratore contiene Reattach.
Eric,

2
Non funziona per me. Si attacca ancora troppo tardi, dopo che l'incidente è già avvenuto. Sembra controllare i processi esistenti una volta al secondo, il che è completamente inutile per questa applicazione.
riv

22

Segui questi passaggi se hai Visual Studio 2017-2019:

  1. File> Apri> Progetto / Soluzione
  2. Scegli il tuo .exe
  3. Debug> Avvia debug

Molto più facile di altri suggerimenti: non devi fare confusione con le proprietà del progetto e non sono necessarie estensioni.


Ma dovrai dire a Visual Studio dove sono i simboli di debug, se non li trova automaticamente
Matt Thomas

1
veloce facile in grado di fare in 5 secondi, lo adoro. Grazie
ComradeJoecool

1
Il mio exe è stato avviato, ma non è stato possibile impostare alcun punto di interruzione. Cosa dovrei fare?
Eric,

2
@Eric Se il mio commento sopra non lo riguarda, consiglio di chiederlo come domanda SO invece che come commento. Il tuo problema avrà maggiore visibilità e avrai la possibilità di spiegare il tuo scenario specifico. Allora facci sapere cosa trovi!
Matt Thomas,

11

Ho trovato questa risposta quando stavo cercando qualcosa di simile. Nel mio caso, non potevo semplicemente utilizzare l'eseguibile come programma di avvio del mio progetto perché doveva essere avviato in un ambiente molto specifico che non potevo riprodurre facilmente (ovvero: avviato da cygwin).

Ho dato un'occhiata all'estensione Reattach come suggerito da mrstrange e anche all'estensione molto simile Attach To Anything ... ma il mio eseguibile sembrava chiudersi troppo rapidamente perché le estensioni potessero notificare e allegare.

Ciò che alla fine mi ha aiutato è stato questo: https://stackoverflow.com/a/4042545/1560865 , che fa riferimento all'articolo MSDN How to: Launch the Debugger Automatically , che a sua volta elenca i seguenti passaggi:

  1. Avvia l'Editor del Registro di sistema (regedit).
  2. Nell'Editor del Registro di sistema, apri la cartella HKEY_LOCAL_MACHINE.
  3. Passa alle opzioni di esecuzione del file di immagine HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \.
  4. Nella cartella Opzioni di esecuzione del file immagine , individuare il nome dell'applicazione di cui si desidera eseguire il debug, ad esempio myapp.exe . Se non riesci a trovare l'applicazione di cui desideri eseguire il debug:
    a. Fare clic con il pulsante destro del mouse sulla cartella Opzioni di esecuzione file immagine e nel menu di scelta rapida, fare clic su Nuova chiave .
    b. Fare clic con il pulsante destro del mouse sulla nuova chiave e nel menu di scelta rapida fare clic su Rinomina . c. Modifica il nome della chiave con il nome della tua applicazione; myapp.exe , in questo esempio.
  5. Fare clic con il pulsante destro del mouse sulla cartella myapp.exe e nel menu di scelta rapida fare clic su Nuovo valore stringa .
  6. Fare clic con il pulsante destro del nuovo valore di stringa e dal menu di scelta rapida, fare clic su Rinomina.
  7. Cambia il nome in debugger.
  8. Fare clic con il pulsante destro del nuovo valore di stringa e nel menu di scelta rapida, fare clic su Modifica . La Modifica stringa visualizzata la casella di dialogo.
  9. Nella casella Dati valore , digitare vsjitdebugger.exe.
  10. Fare clic su OK .
  11. Dal menu Registro di sistema , fare clic su Esci .
  12. La directory contenente vsjitdebugger.exe deve essere nel percorso di sistema. Per aggiungerlo al percorso di sistema, attenersi alla seguente procedura:
    a. Apri il Pannello di controllo nella visualizzazione classica e fai doppio clic su Sistema .
    b. Fare clic su Impostazioni di sistema avanzate .
    c. In Proprietà del sistema , fare clic sulla scheda Avanzate .
    d. Nella scheda Avanzate fare clic su Variabili d'ambiente .
    e. Nella finestra di dialogo Variabili d'ambiente, in Variabili di sistema , selezionare Percorso , quindi fare clic sul pulsante Modifica .
    f. Nella Modifica variabile di sistemafinestra di dialogo, aggiungere la directory alla casella Valore variabile . Utilizzare un punto e virgola per separarlo dalle altre voci nell'elenco.
    g. Fare clic su OK per chiudere la finestra di dialogo Modifica variabile di sistema .
    h. Fare clic su OK per chiudere la finestra di dialogo Variabili d'ambiente .
    io. Fare clic su OK per chiudere la finestra di dialogo Proprietà del sistema .
  13. Ora usa qualsiasi metodo per avviare la tua applicazione. Visual Studio avvierà e caricherà l'applicazione.

Spero che questo aiuti chiunque altro in futuro!


3
Ecco le istruzioni per questo stesso processo con le versioni più recenti di VS (fino al 2019): docs.microsoft.com/en-us/visualstudio/debugger/…
brichins

3

Se non è presente alcun processo, Visual Studio non può collegarsi ad esso.

Tuttavia, è possibile impostare il programma di avvio del progetto in modo che sia qualcosa di diverso dall'output del progetto.


Ho già indagato se quello che voglio fare è giusto, e in realtà lo è. La mia situazione non è un normale caso di debug di Visual Studio. Ho un progetto modello Excel 2010 sviluppato in Visual Studio e i fogli modello hanno eventi di avvio. Eseguo questo modello da Visual Studio, aggiungo alcuni dati nei miei fogli Excel e salvo il file su disco. Quindi l'unico modo in cui posso aprire questo file che si basa anche sull'assembly del modello, è aprirlo dall'explorer, quindi non posso eseguire il debug degli eventi di avvio in questo caso e ovviamente ho un po 'di elaborazione dati all'avvio come l'associazione dati.
Ucodia

Potrebbe essere necessario selezionare "Abilita debug del codice nativo" (proprietà del progetto → DebugAbilita debugger ).
Peter Mortensen

3

Puoi mostrare un MessageBox, questo bloccherebbe l'applicazione, quindi colleghi o ricolleghi il debugger al processo e fai clic su OK per continuare:

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

puoi aggiungerlo al costruttore Form (se usi winforms), quindi questo verrebbe eseguito prima di ogni altra cosa, ad eccezione dell'inizializzazione dei componenti:

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

Quando finisci il tuo debug, commenta quella riga.


3

Puoi avviare il debugger dal tuo codice tramite

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

Ma non perdere questa riga prima di spedire l'applicazione. Forse vuoi usare i flag del compilatore per essere sicuro:

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

2
Questa dovrebbe essere la risposta accettata per tutti i casi in cui stai aspettando che qualche processo esterno avvii la tua applicazione.
TravellingFox

2

Una piccola soluzione che potrebbe soddisfare molte persone.

  • nella prima riga di codice che eseguirà l'exe, aggiungi questo comando

    System.Threading.Thread.Sleep (20000)

Ciò farà dormire l'exe per 20 secondi prima che inizi a elaborare qualsiasi cosa. Quindi hai 20 secondi per collegarti al processo, che può essere fatto rapidamente con ctrl + alt + p, quindi trova il processo, quindi inserisci per allegare.

Non una gran risposta, ma ha funzionato a meraviglia per me: -)


Ho dovuto eseguire il debug di un CGI scritto in "C" di cui avevo il codice sorgente. Ero una soluzione semplice e facile per avere il tempo di allegare al processo in background.
Joël Hecht
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.