Wie hänge ich Visual Studio an einen Prozess an, der noch nicht gestartet wurde?

87

Ich habe ein .NET-Programm, das aus bestimmten Gründen nicht in Visual Studio ausgeführt werden kann (Excel-Datei, die aus einem Excel 2010-Vorlagenprojekt erstellt wurde), für das ich Startereignisse debuggen muss.

Wenn ich Ereignisse debuggen möchte, die nach der Programminitialisierung auftreten, gibt es kein Problem. Ich führe das Programm über den Explorer aus, hänge den Prozess an Visual Studio an und füge dem Code einige Haltepunkte hinzu. Aber hier muss ich Haltepunkte für die Startereignisse setzen. Ich muss in der Lage sein, Prozesse an Visual Studio anzuhängen, nicht abhängig von einer PID, sondern von einem bestimmten Prozessnamen oder einer anderen Lösung, die funktionieren würde.

Das Hinzufügen eines Thread.Sleep(1000)in meinen Startereignissen, um mir Zeit zu geben, den Prozess in Visual Studio anzuhängen, kommt natürlich nicht in Frage!

Ucodia
quelle

Antworten:

96

Eigentlich kannst du; Sie hängen nicht daran, Sie starten es. Geben Sie in den Eigenschaften Ihres Projekts auf der Registerkarte Debugging im Textfeld "Befehl" den Pfad des Programms an, an das Sie eine Verbindung herstellen möchten.

Sie können auch beliebige Befehlszeilenargumente für das Programm in das Feld "Befehlsargumente" eingeben:

Geben Sie hier die Bildbeschreibung ein

Stellen Sie sicher, dass "Anhängen" auf "Nein" eingestellt ist.

Tibi
quelle
6
Gute Lösung, aber beachten Sie, dass das Drücken von F5 in diesem Fall nicht funktioniert. Klicken Sie stattdessen mit der rechten Maustaste auf das betreffende Projekt und klicken Sie im Kontextmenü auf "Debuggen> Neue Instanz starten".
Herman Cordes
1
Damit F5 funktioniert, muss Ihr Projekt das Startprojekt in der Lösung sein. Klicken Sie dazu im Solution Explorer mit der rechten Maustaste auf das Projekt und wählen Sie "Als Startprojekt festlegen".
Tibi
1
Auch wenn Ihr Programm einige externe Abhängigkeiten aufweist, müssen Sie auch "Arbeitsverzeichnis" ändern.
Priyank
Möglicherweise muss "Native Code Debugging aktivieren" aktiviert sein (Projekteigenschaften → DebugDebugger aktivieren ).
Peter Mortensen
Und wie machen Sie das für eine Gesamtlösung mit 40 Projekten?
Tony Tannous
22

Ich habe ein C ++ - Plugin in einem extern erzeugten Prozess debuggt, der beim Auslösen einer Ausnahme beim Start abgestürzt ist, und dies hat perfekt für mich funktioniert:

Fügen Sie die kostenlose Reattach-Erweiterung für Visual Studio hinzu . Bitten Sie ihn, den Prozessnamen erneut zu verknüpfen, bevor er gestartet wird. Es wird ein modaler Dialog angezeigt, der darauf hinweist, dass auf den Start des Prozessnamens gewartet wird.

Starten Sie nun den Prozess und der Visual Studio-Debugger wird sofort angehängt, wobei Ausnahmen abgefangen und Haltepunkte erreicht werden.

seltsam
quelle
Tausendmal ja!
itslittlejohn
Ich habe eine Sackgasse. Beim Starten meines Ziels wurde die Administratorauthentifizierung angefordert. Nach Eingabe von pwd und Neustart von vs war Reattach nicht mehr vorhanden. Nur vs ohne admin auth enthält Reattach.
Eric
2
Funktioniert bei mir nicht Es hängt immer noch viel zu spät an, nachdem der Absturz bereits passiert ist. Es scheint einmal pro Sekunde nach vorhandenen Prozessen zu suchen, was für diese Anwendung völlig sinnlos ist.
Riv
20

Führen Sie die folgenden Schritte aus, wenn Sie über Visual Studio 2017-2019 verfügen:

  1. Datei> Öffnen> Projekt / Lösung
  2. Wählen Sie Ihre .exe
  3. Debuggen> Debuggen starten

Viel einfacher als andere Vorschläge: Sie müssen sich nicht mit den Projekteigenschaften herumschlagen, und es sind keine Erweiterungen erforderlich.

Matt Thomas
quelle
Sie müssen Visual Studio jedoch mitteilen, wo sich die Debugging-Symbole befinden, wenn sie nicht automatisch gefunden werden
Matt Thomas,
1
schnell einfach in 5 Sekunden erledigt, ich liebe es. Vielen Dank
ComradeJoecool
1
Meine Exe wurde gestartet, aber es konnte kein Haltepunkt gesetzt werden. Was soll ich machen?
Eric
2
@Eric Wenn mein Kommentar oben nicht darauf eingeht, empfehle ich, dies als SO-Frage anstelle eines Kommentars zu stellen. Ihr Problem wird sichtbarer und Sie haben die Möglichkeit, Ihr spezifisches Szenario zu erläutern. Dann lassen Sie uns wissen, was Sie finden!
Matt Thomas
11

Ich fand diese Antwort, als ich nach etwas Ähnlichem suchte. In meinem Fall konnte ich die ausführbare Datei nicht einfach als Startprogramm für mein Projekt verwenden, da sie in einer sehr spezifischen Umgebung gestartet werden musste, die ich nicht einfach reproduzieren konnte (namentlich: von cygwin gestartet).

Ich habe mir die von mrstrange vorgeschlagene Reattach-Erweiterung und auch die sehr ähnliche Attach To Anything- Erweiterung angesehen ... aber meine ausführbare Datei schien zu schnell zu schließen, als dass die Erweiterungen benachrichtigt und angehängt werden könnten .

Was mir schließlich geholfen hat, war Folgendes : https://stackoverflow.com/a/4042545/1560865 , das auf den MSDN-Artikel verweist. Gewusst wie: Starten Sie den Debugger automatisch , in dem wiederum die folgenden Schritte aufgeführt sind:

  1. Starten Sie den Registrierungseditor (regedit).
  2. Öffnen Sie im Registrierungseditor den Ordner HKEY_LOCAL_MACHINE.
  3. Navigieren Sie zu den Ausführungsoptionen für HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ image file.
  4. Im Image File Execution Options - Ordner, suchen Sie den Namen der Anwendung , die Sie debuggen, wie wollen myapp.exe . Wenn Sie die Anwendung, die Sie debuggen möchten, nicht finden können:
    a. Klicken Sie mit der rechten Maustaste auf den Ordner Ausführungsoptionen für Bilddateien , und klicken Sie im Kontextmenü auf Neuer Schlüssel .
    b. Klicken Sie mit der rechten Maustaste auf die neue Taste, und klicken Sie im Kontextmenü auf Umbenennen . c. Bearbeiten Sie den Schlüsselnamen in den Namen Ihrer Anwendung. in diesem Beispiel myapp.exe .
  5. Klicken Sie mit der rechten Maustaste auf den Ordner myapp.exe , und klicken Sie im Kontextmenü auf Neuer Zeichenfolgenwert .
  6. Klicken Sie mit der rechten Maustaste auf den neuen Zeichenfolgenwert, und klicken Sie im Kontextmenü auf Umbenennen.
  7. Ändern Sie den Namen in debugger.
  8. Klicken Sie mit der rechten Maustaste auf den neuen Zeichenfolgenwert, und klicken Sie im Kontextmenü auf Ändern . Das Dialogfeld Zeichenfolge bearbeiten wird angezeigt.
  9. Geben Sie im Feld Wert den Wert einvsjitdebugger.exe .
  10. Klicken Sie auf OK .
  11. Klicken Sie im Menü Registrierung auf Beenden .
  12. Das Verzeichnis mit vsjitdebugger.exe muss sich in Ihrem Systempfad befinden. Gehen Sie folgendermaßen vor, um es dem Systempfad hinzuzufügen:
    a. Öffnen Sie die Systemsteuerung in der klassischen Ansicht und doppelklicken Sie auf System .
    b. Klicken Sie auf Erweiterte Systemeinstellungen .
    c. In den Systemeigenschaften , klicken Sie auf die erweiterte Registerkarte.
    d. Klicken Sie auf der Registerkarte Erweitert auf Umgebungsvariablen .
    e. In der Umgebungsvariablen Feld Dialog unter Systemvariablen , wählen Sie Pfad , klicken Sie auf die Bearbeiten - Taste.
    f. In der Systemvariablen bearbeitenFügen Sie im Dialogfeld das Verzeichnis zum Feld Variablenwert hinzu . Verwenden Sie ein Semikolon, um es von anderen Einträgen in der Liste zu trennen.
    G. Klicken Sie auf OK , um das Dialogfeld Systemvariable bearbeiten zu schließen .
    h. Klicken Sie auf OK , um das Dialogfeld Umgebungsvariablen zu schließen.
    ich. Klicken Sie auf OK , um das Dialogfeld Systemeigenschaften zu schließen.
  13. Verwenden Sie jetzt eine beliebige Methode, um Ihre Anwendung zu starten. Visual Studio startet und lädt die Anwendung.

Hoffe, dass dies in Zukunft allen anderen hilft!

Hauke ​​P.
quelle
3
Hier sind die Anweisungen für denselben Prozess mit neueren Versionen von VS (bis 2019): docs.microsoft.com/en-us/visualstudio/debugger/…
brichins
3

Wenn es keinen Prozess ist dann Visual Studio kann nicht anhängen zu.

Sie können das Startprogramm Ihres Projekts jedoch so einstellen, dass es nicht die Ausgabe Ihres Projekts ist.

ChrisF
quelle
Ich habe bereits untersucht, ob das, was ich tun möchte, richtig ist und tatsächlich ist. Meine Situation ist kein gewöhnlicher Visual Studio-Debugging-Fall. Ich habe ein in Visual Studio entwickeltes Excel 2010-Vorlagenprojekt und die Vorlagenblätter enthalten Startereignisse. Ich führe diese Vorlage in Visual Studio aus, füge einige Daten in meine Excel-Tabellen ein und speichere die Datei auf der Festplatte. Die einzige Möglichkeit, diese Datei zu öffnen, die auch von der Vorlagenassembly abhängt, besteht darin, sie über den Explorer zu öffnen. Daher kann ich die Startereignisse in diesem Fall nicht debuggen, und natürlich habe ich beim Start eine Datenverarbeitung wie Datenbindung.
Ucodia
Möglicherweise muss "Native Code Debugging aktivieren" aktiviert sein (Projekteigenschaften → DebugDebugger aktivieren ).
Peter Mortensen
3

Sie können eine MessageBox anzeigen. Dies würde die Anwendung blockieren. Anschließend hängen Sie den Debugger an den Prozess an oder fügen ihn erneut hinzu und klicken auf OK, um fortzufahren:

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

Sie können es dem Formularkonstruktor hinzufügen (wenn Sie Winforms verwenden), sodass dies vor allem anderen ausgeführt wird, mit Ausnahme der Initialisierung von Komponenten:

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

Wenn Sie das Debuggen beendet haben, kommentieren Sie diese Zeile aus.

Raynet
quelle
3

Sie können den Debugger über Ihren Code über starten

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

Entfernen Sie diese Zeile jedoch nicht, bevor Sie Ihre Anwendung versenden. Vielleicht möchten Sie Compiler-Flags verwenden, um sicherzugehen:

    public static void Main(string[] args)
    {
      #if debug
      System.Diagnostics.Debugger.Launch();
      #endif
    }
Jemandem
quelle
2
Dies sollte die akzeptierte Antwort für alle Fälle sein, in denen Sie darauf warten, dass ein externer Prozess Ihre Anwendung startet.
TravellingFox
2

Eine kleine Lösung, die vielen Menschen passen könnte.

  • Fügen Sie in der ersten Codezeile, die die Exe ausführen wird, diesen Befehl hinzu

    System.Threading.Thread.Sleep (20000)

Dadurch schläft die Exe 20 Sekunden lang, bevor sie mit der Verarbeitung beginnt. Dann haben Sie 20 Sekunden Zeit, um eine Verbindung zum Prozess herzustellen. Dies kann schnell mit Strg + Alt + P erfolgen. Suchen Sie dann den Prozess und geben Sie ihn ein, um ihn anzuhängen.

Keine gute Antwort, aber für mich ein Vergnügen: -)

user2728841
quelle
Ich musste ein in "C" geschriebenes CGI debuggen, für das ich den Quellcode hatte. Ich war eine einfache Lösung, um Zeit für den Hintergrundprozess zu haben.
Joël Hecht