wake-up-neo.com

VS2012-Haltepunkte werden nicht getroffen

Ich habe eine Klasse, die so aussieht:

public class MyService
{
    private MyService(){}
    public static string GetStuff()
    {
        var stuffDid = new MyService();
        return stuffDid.DoStuff();
    }
    private string DoStuff()
    {
        //do stuff
    }
    //other private helpers

}

Natürlich habe ich viel ausgelassen, aber das ist die allgemeine Shell.

Jetzt habe ich einen Unit-Test:

[Test]
public void MyTest()
{

    var results = MyService.GetStuff();
}

Ich setze Haltepunkte in meinem Gerätetest, und ich kann sehen, dass results Daten enthält. Allerdings setze ich Haltepunkte buchstäblich überall auf MyService und nichts wird getroffen, wenn ich sie nicht auf eine geschweifte Klammer setze. Was ich nicht verstehen kann, da results Daten enthält, sollten meine return-Anweisungen in MyService getroffen werden, oder?

Fehlt mir etwas? Habe ich die Grundregeln von etwas völlig vergessen? Wie kommt es, dass nichts in MyService getroffen wird? Und wenn ich manuell mit F11 hineinkomme, hüpft es nur herum und geht nicht durch jede Zeile, wie ich es erwartet hätte. Auch wenn ich manuell durchsteige, neige ich dazu, bestimmten Code zu schlagen, nachdem ich ihn ursprünglich hätte treffen sollen. Und alle switch-Anweisungen scheinen standardmäßig auf die erste Option gesetzt zu sein, selbst wenn der Wert geändert wird, wenn CLEARLY eine andere case eingeben sollte.

Ich habe sogar versucht, MyService constructor public zu erstellen und alle static-Methoden wegzunehmen, und es funktioniert immer noch nicht.

Bearbeiten: Meine Tests und der 'Core'-Code befinden sich in derselben Lösung, jedoch mit unterschiedlichen Projekten (Test und Core). Bei anderen Tests gibt es kein Problem, das Haltepunkte in Core trifft, nur dies bei einem bestimmten Test (der einzige Test, der MyService testet).

Edit 2:

Ich habe meine PDB-Dateien gelöscht und die Lösung gereinigt. Immer noch nichts.

40
RJP

Es stellte sich heraus, dass dies mit der Aktivierung von Code Coverage zusammenhängt.

Durch das Deaktivieren wurde das Problem behoben.

Wie Sie die Codeabdeckung deaktivieren können, erfahren Sie unter dem folgenden Link

Codeabdeckung deaktivieren

9
RJP

Einige Ideen.

  1. Stellen Sie sicher, dass es sich um einen Debug-Build und nicht um ein Release handelt
  2. Deaktivieren Sie Optimierungen in Ihren Projekteigenschaften, wenn diese aktiviert sind
  3. Versuchen Sie, Debugger.Break() in Ihren Code anstelle eines Haltepunkts einzufügenin VS
  4. Stellen Sie sicher, dass Haltepunkte aktiviert sind (Debug-> Windows-> Haltepunkte-Symbolleiste) und das Haltepunktsymbol dauerhaft sein sollte
  5. Führen Sie Ihre Bewerbung aus. Laden Sie das Debug-> Fenster-> Modulfenster. Überprüfen Sie Ihre Baugruppe, um zu sehen, ob Symbole geladen sind. Wenn nicht, kann eine entsprechende Statusmeldung angezeigt werden.

Haben Sie das Datum überhaupt auf Ihrem Computer angepasst? Dies kann einen Build-Prozess wirklich vermasseln. Löschen Sie in diesem Fall alle Ihre obj/bin-Ordner manuell und kompilieren Sie sie erneut.

61
Alan

Es könnte sein, dass Sie nur ein Projekt debuggen, nicht beide Test und Core.

Sie können VS so einstellen, dass mehrere Projekte gleichzeitig debuggen. Sie können dies mit right-click your solution > Properties > Common Properties > StartUp Project tun.

Hier können Sie "Mehrere Startprojekte" einstellen enter image description here

Setzen Sie einfach Core und Test auf Start. Dies kann Ihr Problem lösen.

11
sa_ddam213

Ich habe ein sehr spezifisches Szenario, das zu dem offensichtlichen Problem geführt hat, dass "Haltepunkt nicht getroffen wurde". 

Da hier keine anderen Antworten erwähnt wurden, werde ich meine hinzufügen, falls es jemandem hilft, der das gleiche Problem hatte.

Die Lösung in meinem Fall war dumm und mit so viel LINQ wie ich verwende, hätte ich das früher herausfinden müssen. Wenn eine Methode ausgeführt wird, die ein IEnumerable zurückgibt, wobei die darin enthaltenen return-Anweisungen tatsächlich yield return-Anweisungen sind, wird diese Methode beim Aufruf nicht ausgeführt. 

Es wird tatsächlich ausgeführt, wenn Sie eine andere Methode aus diesem IEnumerable-Objekt aufrufen, z. B. ToList() oder Count(). Nur dann wird die Methode ausgeführt und der Haltepunkt erreicht.

5
nuzzolilo

Stellen Sie nur sicher, dass Sie Ihre Assembly mit den Debugger-Symbolen erstellt haben.

Diese Option muss mit "full" gefüllt sein:

Klicken Sie mit der rechten Maustaste auf Ihr Projekt, das Ihre Codedatei enthält, wobei die Haltepunkte nicht erreicht werden. Wählen Sie "Eigenschaften".

Nachdem Sie die Projekteigenschaften geöffnet haben, wählen Sie die Registerkarte "Erstellen". Achten Sie auf die Schaltfläche "Erweitert ..." unten auf der Registerkarte. (Innerhalb der "Output" -Gruppe)

Klicken Sie auf diese Schaltfläche und wählen Sie "full" für die Eigenschaft "Debuginfo". Dies sollte ein Grund dafür sein, dass Haltepunkte nicht getroffen werden. Visual Studio verwendet die in den pdb-Dateien gespeicherten Symbole, um die genaue Position des Haltepunkts zu ermitteln. Wenn diese Dateien nicht erstellt werden, werden keine Haltepunkte getroffen. Möglicherweise haben Sie die Erstellung dieser Dateien deaktiviert, um Ihre Projektdateistruktur aufzuräumen. In dieser Situation habe ich erkannt, dass ich diese Dateien brauche.

3
Marco Klein

Ich hatte kürzlich das gleiche Problem und schlug meinen Kopf gegen die Wand.

Die Antwort erwies sich als ziemlich dumm: Irgendwie wurde mein Testprojekt nicht mehr mit dem Hauptbibliothekprojekt synchronisiert. Ich habe die Debug-Versionen des Tests und der Bibliothek erstellt, aber das Testprojekt kopierte die Bibliothek aus dem Ordner bin/Release. Ich habe gerade die Projektreferenz neu erstellt und alles wurde behoben.

P.S. Es war sogar noch krasser: Der Debugger ging in eine Bibliotheksfunktion, übersprang aber irgendwie eine Zeile in der Mitte.

3
Ark-kun

Das klingt, als würden die pdb-Dateien in Ihrer Test-Sandbox nicht aktualisiert.

1) Stellen Sie sicher, dass Sie sich im Debug-Modus befinden.

2) Können Sie versuchen, ein Bereitstellungselement für die PDB-Dateien explizit einzufügen?

  • Sie sagten, dass Sie in Ihrem Testprojekt einen Debug-Punkt hinzufügen können.
  • Wenn Sie den Debug-Punkt in Ihrem Testprojekt erreicht haben, überprüfen Sie, ob die PDB-Dateien mit dem neuesten Zeitstempel im Ordner Out Ihrer Sandbox vorhanden sind.

3) Wenn 1 und 2 fehlschlagen, habe ich festgestellt, dass Visual Studio manchmal einen Neustart erfordert :)

1
Sundeep Jacob

Sie müssen DoStuff statisch machen.

private static string DoStuff()
{
    //do stuff
}
1
Sorceri

Ich hatte dies in einem von 25 Projekten, die alle in der gleichen Lösung waren. Bei den anderen Projekten wurden Haltepunkte gewürdigt, dies jedoch nicht. Ich habe das Projekt aus der Lösung entfernt (löschen, nicht entladen), was alle Verweise darauf brach und es dann wieder der Lösung hinzufügte und das funktionierte!

Wenn dies nicht funktioniert, möchten Sie möglicherweise das Problemprojekt von Grund auf neu erstellen und dieses neue Projekt der Lösung hinzufügen.

Die beste Erklärung dafür, warum dies neben dem reinen Glück funktioniert hat, ist, dass wir Projekte im Laufe der Jahre viele Male von einer Version von VS auf eine andere migriert haben und möglicherweise eine dieser Migrationen dieses Problem verursacht hat.

1
Denis
  1. Reinigen Sie die Lösung, erstellen Sie sie neu und führen Sie auch das Startprojekt aus.

  2. Bitte werfen Sie einen kurzen Blick auf BUILD> Configuration Manager, um sich zu vergewissern, welche Konfigurationseigenschaften eingerichtet sind. Wenn es sich um eine Entwicklung handelt, müssen Sie möglicherweise die Projekteigenschaften anpassen -> Klick-Voreinstellung -> Debug-Info in [Ausgabe-Registerkarte] in 'voll' ändern.

  3. sie können Schritt 2 auch befolgen, auch wenn es sich nicht um einen Entwicklungsmodus handelt

1
kausar ahmed

Ihr Code zeigt einen "Dienst" an, der möglicherweise als separater Prozess ausgeführt wird. Wenn dies der Fall ist, können Sie Ihre Assembly laden. Die Haltepunkte wären also durchgezogene rote Kreise, aber eine andere Kopie der Assembly, die in einem separaten Prozess ausgeführt wird, verarbeitet tatsächlich die Anforderungen.

  • Überprüfen Sie den Task-Manager auf mögliche Straftäter (Prozesse, die möglicherweise Ihren Dienst hosten). Töten Sie sie beim Debuggen, um zu bestätigen, dass die Anrufe fehlschlagen.
  • Versuchen Sie es mit Debugger.Break ();
  • Erstellen Sie eine Debug-Protokolldatei, nachdem Sie die Eingabe und die Assemblynamen in das Protokoll geladen haben. Stellen Sie sicher, dass Ihr Protokoll jedes Mal eine andere Datei ist, um Probleme beim asynchronen Zugriff zu vermeiden.
1
Sten Petrov

Aus Erfahrung weiß ich, dass Visual Studio keine eindeutige Methode zum Debuggen von Diensten hat, insbesondere von Windows-Diensten. Versuchen Sie, GetStuff mit etwas Code zu versehen, um in eine Textdatei zu drucken. Auf diese Weise wissen Sie zumindest, dass der Code angezeigt wird. Beim Erstellen von Diensten greife ich oft zum Testen auf diese Methode zurück.

0
vesuvious

Das hier ist ziemlich dunkel: 

Stellen Sie sicher, dass Sie nicht zwei virtuelle Verzeichnisse mit unterschiedlichen App-Pools haben, die auf den gleichen physischen Ort auf Ihrer Festplatte zeigen. Während der Entwicklung kann dies manchmal zu Testzwecken oder aus Versehen geschehen.

Ich bin nicht ganz zu 100% mit den technischen Eigenschaften vertraut, aber ich hatte zwei AppPools und zwei virtuelle Verzeichnisse und es wurde kein Haltepunkt getroffen, da ich davon ausgehe, dass der physische Pfad in IIS/Visual Studio irgendwie dem anderen Apppool zugeordnet wurde und nicht dem tatsächlich vorhandenen ausführen.

0
Simon_Weaver

VS verhält sich genau so, wie Sie es beschrieben haben (trifft nicht auf die Haltepunkte, trifft den Code, den Sie beim Durchlaufen nicht erwarten sollen), wenn die .pdb-Datei verwendet wird, die mit dem Quellcode erstellt wurde, der sich von dem beim Debuggen verwendeten Code unterscheidet . Ich kann nicht garantieren, dass dies Ihr Fall ist, aber ich habe ein solches Verhalten oft beobachtet, als ich in den Code vordringen musste, der als vorgefertigte Bibliothek geliefert wurde, die gegen einen älteren/anderen Code mit denselben Dateinamen/erstellt wurde. Symbole.

0
nullop

Sie könnten versuchen, eine Thread.Sleep(5000) in der GetStuff-Methode hinzuzufügen und die Option Attach to Process verwenden 

Visual Studio> Extras> An Prozess anhängen und sehen, ob Haltepunkte unterhalb dieser Linie getroffen werden.

0

Vielleicht verweist Ihr Test-Projekt auf eine ältere Core-Binärdatei und nicht auf das Core (Quellcode) -Projekt?

Fügen Sie die Referenz erneut in Ihr Testprojekt ein:

Gehen Sie zu Ihrem Test-Projekt und entfernen Sie den Verweis auf das Core-Projekt.

Wählen Sie nun den Ordner "Referenzen" aus, klicken Sie mit der rechten Maustaste darauf und wählen Sie die Menüoption, um eine neue Referenz hinzuzufügen. Stellen Sie im Dialogfeld Referenz-Manager sicher, dass Sie links Solution und dann Projects auswählen. Wählen Sie dann in der Mitte des Referenzmanager-Dialogfelds das Projekt Core aus.

Versuchen Sie erneut, zu debuggen, und prüfen Sie, ob dies hilfreich ist.

0
chue x

Ich bin auf eine ähnliche Ausgabe gestoßen. Es stellte sich heraus, dass es für mich eine schlechte Migration von VS2010 nach VS2012 mit der *.testrunconfig-Datei war. Ich habe den alten gelöscht und einen neuen eingerichtet, um das Problem zu beheben.

0
JG in SD

Versuchen Sie zunächst, Ihr Projekt neu zu erstellen, indem Sie mit der rechten Maustaste auf das Projekt klicken.

Wenn das nicht funktioniert hat, überprüfen Sie dies:

Right mouse click your project
select [Properties]
select the [Build] tab
make sure [Define DEBUG constant] and [Define TRACE constant] are checked
Click the [Advanced] button at the bottom of the Build tabpage
Make sure that [Debug Info:] is set to [full]
Click [OK] and rebuild the project ;-)

Hoffe das funktioniert für dich! (Schritt 6 generiert die .pdb-Dateien, dies sind die Debugsymbole)

0
Zia Ur Rahman

Um Schritt für Schritt zu debuggen, müssen Sie zwei Dinge tun. Zuerst müssen Sie den Haltepunkt festlegen. Dann müssen Sie den Debugger an den Prozess anfügen, der Ihren Code ausführt. Wenn Sie IIS Express ausführen und über eine 64-Bit-Maschine verfügen, müssen Sie iisexpress.exe anfügen, das Ihren Code ausführt. Wenn Sie die Tastenkombination STRG + ALT + P drücken, gelangen Sie in das Fenster zum Anhängen an den Prozess. Nach dem Anbringen sollte der Haltepunkt getroffen werden, wenn der Code übereinstimmt.

0
Hemant_R_D

Noch ein paar Sachen zum probieren:

  • Prüfen Sie, ob die geladenen Symbole mit der ausführbaren Datei übereinstimmen:
    Öffnen Sie eine VS-Eingabeaufforderung und cd in das Verzeichnis, in dem sich die ausführbare Datei befindet, die Sie debuggen . Führen Sie dann einen dumpbin /PDBPATH:VERBOSE MyServiceExecutable.exe aus, und scannen Sie die Ausgabe auf "PDB age mismatch" (Ref: http://msdn.Microsoft. de/de-de/library/44wx0fef.aspx )

  • Nicht sicher über VS 2012, aber ältere Versionen von VS hatten einen Fehler, bei dem die falsche Quelldatei angezeigt wurde, vorausgesetzt, dass in Ihrem Projekt zwei Quelldateien vorhanden sind, die dasselbename haben, auch wenn sich diese in verschiedenen Ordnern befinden . Wenn Ihr Projekt eine andere Quelldatei mit demselben Namen enthält, prüfen Sie, ob das Umbenennen einer dieser Dateien hilfreich ist. (Update: Scheint VS 2012 ist auch betroffen .)

0
afrischke

In Unit-Tests traf ich keine Haltepunkte und erkannte, dass ich den Test ausführte und nicht den Test debuggen konnte. Am oberen Rand des Test Explorers befinden sich die Optionen "Alle ausführen", "Fehlgeschlagen", "Bestanden" usw. Wenn Sie einen Test ausführen, werden Haltepunkte nicht getroffen. Um einen Test zu debuggen, klicken Sie im Test Explorer mit der rechten Maustaste auf den Test oder die Testgruppe und wählen Sie Ausgewählte Tests debuggen.

0
JKMcF

Wenn es sich im Freigabemodus befindet, wechseln Sie in den Debug-Modus.

0
NoobieDude

Dumme mich, dass das Testprojekt nicht gebaut werden sollte:

enter image description here

0
Jeremy Thompson

Ich habe das gleiche Problem. Vielleicht hilft Ihnen meine Lösung, Ihr Problem zu lösen. Wählen Sie einfach in "Attach to Process" für die Option "Attach to" den Wert "Avtomatic: Native code" aus. Freundliche Grüße.

Image

0
Pavlo Vons