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.
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
Einige Ideen.
Debugger.Break()
in Ihren Code anstelle eines Haltepunkts einzufügenin VSHaben 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.
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
Setzen Sie einfach Core
und Test
auf Start. Dies kann Ihr Problem lösen.
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.
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.
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.
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?
3) Wenn 1 und 2 fehlschlagen, habe ich festgestellt, dass Visual Studio manchmal einen Neustart erfordert :)
Sie müssen DoStuff statisch machen.
private static string DoStuff()
{
//do stuff
}
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.
Reinigen Sie die Lösung, erstellen Sie sie neu und führen Sie auch das Startprojekt aus.
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.
sie können Schritt 2 auch befolgen, auch wenn es sich nicht um einen Entwicklungsmodus handelt
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.
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.
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.
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.
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.
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.
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.
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)
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.
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 .)
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.
Wenn es sich im Freigabemodus befindet, wechseln Sie in den Debug-Modus.
Dumme mich, dass das Testprojekt nicht gebaut werden sollte:
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.