Visual Studio: Automatisches Anhängen an einen Prozess, wenn der Prozess erzeugt wird

74

Ich möchte eine Verbindung zu einem Prozess (a.exe) herstellen, sobald dieser erzeugt wird. Ist dies mit VS möglich? Ich kenne nur den Namen des Prozesses. Eigentlich möchte ich einen Haltepunkt im C # -Code setzen, aber der Code gehört zu einer anderen ausführbaren Datei, die von der aktuell ausgeführten Anwendung (c.exe) gestartet wird. Der Code befindet sich innerhalb des Initialisierungszeitraums, sodass ich das Anhängen nicht manuell durchführen kann.

Bin Chen
quelle
Können Sie uns mehr Kontext geben? Besitzen Sie den Prozess - ist es Ihr Code? Ruft dieser Prozess Ihren Code auf?
Jaco Pretorius

Antworten:

72

Als ich zuvor mit dieser Situation konfrontiert war (und beide Prozesse kontrollierte), stellte ich fest, dass eine anständige Problemumgehung darin besteht, Debugger.Launch () im Einstiegspunkt des Laichprozesses aufzurufen . VS öffnet dann ein Dialogfeld und lässt Sie an den Prozess anhängen.

Mark Simpson
quelle
31

Weitere Informationen finden Sie im MSDN-Artikel unter Gewusst wie: Automatisches Starten des Debuggers. Auf diese Weise können Sie die Vielzahl von Dialogfeldern zum Klicken auf Bestätigungen überspringen, ohne die Benutzerkontensteuerung oder andere Probleme zu deaktivieren. Der Artikel listet die folgenden Schritte auf:

  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 vsjitdebugger.exe ein .
  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 demDialogfeld "Systemvariable bearbeiten ", fügen Sie das Verzeichnis dem 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
Ruben Bartelink
quelle
3
Ich mag diese Antwort, weil sie funktioniert, wenn Ihr Code im Release-Modus mit eingeschalteten PDBs erstellt wird. Die obige Debugger.Launch () -Methode funktioniert nicht, wenn sie im Release-Modus erstellt wurde.
Brezel
1
Ich musste auch einen Zeichenfolgenwert in HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug mit dem Namen "Auto" mit dem Wert 1 hinzufügen, da vsjitdebugger ohne diesen Fehler beim Öffnen fehlschlägt
user1011138
2
Oh Gott, warum ist das so involviert
Yuyoyuppe
9

Ich habe nach einer Möglichkeit gesucht, dies zu tun, wenn ich eine Konsolenanwendung innerhalb eines Abnahmetests starte.

Ich habe das heute gefunden - https://blogs.msdn.microsoft.com/visualstudioalm/2014/11/24/introducing-the-child-process-debugging-power-tool/

Es ist ein Add-On zum Visual Studio und ein Genuss. Wenn ich einen Abnahmetest debugge (ich verwende Resharper Test Runner) und einen Haltepunkt in der App platziere, die gestartet wird, kann ich die App jetzt in derselben Visual Studio-Instanz debuggen.

Antony Scott
quelle
Dies ist die einfachste aller Lösungen, die ich hier ausprobiert habe. Einfach zu installieren und funktioniert einfach. Keine Codeänderungen erforderlich.
Brian White
9

Eine weitere gute Lösung ist die Verwendung der Visual Studio-Erweiterung "ReAttach". Kann hier gefunden werden .

Wenn Ihr Prozess derzeit nicht ausgeführt wird, werden Sie von ReAttach aufgefordert, ihn zu starten und anzuhängen, sobald er verfügbar ist.

Mark Kowalski
quelle
6

"Entrian Attach" ist ein Visual Studio-Add-In, das genau dies tut. Sie geben den Namen Ihrer ausführbaren Datei an und hängen den Debugger an, wenn der Prozess gestartet wird, unabhängig davon, wie er gestartet wurde, bevor Code ausgeführt wurde.

(Offenlegung: Ich bin der Autor. Ich habe Attach erstellt, weil ich dieses Problem ständig habe!)

RichieHindle
quelle
Hat bei mir nicht funktioniert ... Ich konnte sehen, wie die Symbole geladen wurden, aber dann lief der Prozess weiter und wurde beendet. Vielleicht liegt es daran, dass ich versucht habe, einen Prozess anzuhängen, den ich nicht in der Lösung hatte, und daher gab es keinen Haltepunkt.
Nelson Rothermel
@ NelsonRothermel: Ich würde gerne helfen, aber Stack Overflow ist nicht der richtige Ort für den technischen Support von Entrian Solutions. :-) Schicken Sie mir eine E-Mail ([email protected]), wenn Sie möchten, dass ich versuche, Ihnen bei Ihrem Problem zu helfen.
RichieHindle
1
Am Ende funktionierte es mit gflags.exe, und der Schlüssel für mich war, einen bestimmten Ausnahmetyp zu unterbrechen. Ich denke, Ihre Lösung hätte tatsächlich funktioniert, wenn ich sie richtig eingerichtet hätte. Ich werde es jetzt nicht brauchen, aber es ist ein interessantes Add-In, für das ich möglicherweise in Zukunft eine Verwendung haben werde.
Nelson Rothermel
4

Sie können auch das Dienstprogramm gflags.exe verwenden, das mit den Windows-Debugging-Tools geliefert wird. Sie müssen lediglich gflags.exe öffnen, dann zur Bilddatei gehen, den Prozessnamen (a.exe) eingeben, die Tabulatortaste drücken und das Kontrollkästchen Debugger in der Textbox aktivieren Geben Sie den vs-Pfad mit der Option / debugexe ein (dh "C: \ Programme (x86) \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ devenv.exe" / debugexe).

Das automatisch visuelle Studio wird geöffnet, sobald der Prozess ausgeführt wird. Sie können Ihre Haltepunkte hinzufügen und auf Ausführen klicken.

Pablo Retyk
quelle
3

Wie wäre es damit: Öffnen Sie das Projekt für a.exein VS, legen Sie die Haltepunkte usw. fest. Öffnen Sie dann die Projekteigenschaften für a.exe, Registerkarte Debugging , und setzen Sie den Befehl auf c.exe. Dann drücken Sie einfach Debug .

Leider habe ich das bei verwalteten Projekten nie gemacht, so dass ich hier daneben liegen kann. So würde ich es jedoch mit nicht verwalteten (C ++) Projekten machen. Ich denke, Managed Debugger sollte es auch unterstützen.

atzz
quelle
1
In meiner Situation wird die ausführbare Datei, die ich debuggen möchte, im Rahmen des Startvorgangs einer anderen ausführbaren Datei gestartet. Ich würde vermuten, dass dies die treibende Kraft hinter der Frage ist.
Mooing Duck
Hat für mich gearbeitet. Schnell und einfach für direkte Fälle, aber möglicherweise nicht gut für komplexere Fälle.
AbstractDissonance
0

Wenn C # -Code von nicht verwaltetem Code gestartet wird, stellen Sie sicher, dass Sie "Debugging von nicht verwaltetem Code" unter @Project-Eigenschaften -> Debug-Optionen aktivieren.

Phanidhar
quelle
0

Ab VS 2013 SP2 gibt es ein kostenloses Tool von Microsoft, das dasselbe tut wie der zuvor erwähnte "Spawned Process Catcher" - das Anhängen aller Prozesse, die von einem Prozess gestartet werden, der sich bereits im Debugging befindet. Hinweis: Ich habe dies nur mit nicht verwaltetem C ++ getestet (dies funktioniert einwandfrei).

Microsoft Child Process Debugging Power Tool

MSDN-Blogeintrag

user2328447
quelle