10 Stimmen

Überschreitungsmethode ohne Symbole - Wie kann man einsteigen?

Mit Visual Studio 2008 SP1 und ein VB.NET-Projekt; Ich habe einige Code, die ich nicht Schritt in. Das Immediate Window zeigt die Meldung "Stepping über Methode ohne Symbole 'Some.Namespace.Here'"

Wie kann ich sicherstellen, dass die Methode immer Symbole hat?! Ich muss in jede Codezeile gehen. Ich drücke F8 (das ist "Step Into" in VS2008, aus dem Gedächtnis ich denke, es verwendet werden, um F11 in VS2005).

Dieses Debugger-Zeug hat mich schon immer verwirrt: Auf den Eigenschaftsseiten der Lösungsebene sehe ich ein Konfigurations-Dropdown mit 4 Werten: Aktiv (Debug), Debug, Release, Alle Konfigurationen. - derzeit auf "Aktiv (Debug)" eingestellt Auf der Projektebene sehe ich ein Konfigurations-Dropdown mit 2 Werten: Debuggen, Freigeben. - derzeit auf "Debug" eingestellt

22voto

McMuttons Punkte 871

Ich weiß, dies ist eine alte Frage, aber sind Sie vielleicht mit Yield-Funktionalität in einer Methode, die eine IEnumerable zurückgibt?

Zum Beispiel (erfunden):

public IEnumerable<object> GetObjects(IEnumerable<object> objects)
{
    foreach(var obj in objects)
        yield return obj;
}

Ich stoße in meinen Unit-Tests oft darauf, aber aufgrund von Lazy Evaluation werden Yield-Anweisungen erst verarbeitet, wenn es notwendig ist. Eine Möglichkeit, die Aufzählung zu erzwingen, ist z. B. ein .ToList() an die aufrufende Anweisung anzuhängen, obwohl man das nicht permanent tun möchte, es sei denn, der Aufruf ist vielleicht ein Test für eine Funktionalität, bei der die Aufzählung selbst nicht wichtig ist.

Wenn Sie also die folgenden Schritte ausführen, sollten Sie eine Aufzählung erhalten:

GetObjects(new List<object>()).ToList();

Kurz gesagt, wenn Sie eine Methode aufrufen, die eine Aufzählung erfordert, dann aber das Ergebnis nicht aufzählen, erhalten Sie diesen Fehler in der Ausgabe. Dies kann auch bei LINQ-Anweisungen wie .Select passieren.

Edit: Ich habe nicht bemerkt, dass es ein VB.NET-Projekt war, aber ich bin mir ziemlich sicher, dass das Prinzip immer noch gilt.

4voto

Dan Finucane Punkte 1497

Ich hatte genau das gleiche Problem in Visual Studio 2010. Ich würde versuchen, in .NET Framework-Quellcode Schritt, Visual Studio würde Schritt über sie, das Ausgabefenster würde sagen, dass es nicht Schritt in, weil die Symboldatei nicht geladen wurde, aber wenn ich auf die Module-Fenster sah ich sehen, dass die entsprechende Symboldatei in der Tat geladen wurde.

Das Problem bestand darin, dass die .NET-Symboldatei zwar geladen wurde, aber nicht die .NET-Symboldatei mit den darin enthaltenen Quellinformationen war. Der öffentliche Symbolserver von Microsoft unter http://referencesource.microsoft.com/symbols enthält Symbole mit Quellenangaben. Der öffentliche Symbolserver von Microsoft unter http://msdl.microsoft.com/download/symbols enthält Symbole ohne Quellenangaben.

Eine Lösung besteht darin, den _NT_SYMBOL_PATH richtig einzustellen, so dass er die Symbole des .NET Frameworks von http://referencesource.microsoft.com/symbols wenn sie existieren und von http://msdl.microsoft.com/download/symbols sonst. Etwas in dieser Art würde funktionieren:

_NT_SYMBOL_PATH=SRV*d: \SymbolsCache *http://referencesource.microsoft.com/symbols;SRV\*d: \SymbolsCache *http://msdl.microsoft.com/download/symbols

Dieser _NT_SYMBOL_PATH veranlasst den Debugger, zuerst nach Symbolen mit Quellcode-Informationen zu suchen und dann, wenn es keine gibt, die Symbole ohne Quellcode zu finden. Wenn Visual Studio eine Symboldatei mit den Quellinformationen hat, ist es in der Lage, in diesen Code einzugreifen.

0voto

Kevin LaBranche Punkte 20730

Wenn es sich bei dem fraglichen Namensraum um eine Dll eines Drittanbieters handelt, die nicht mit den Symbolen (pdb-Datei) geliefert wurde, tritt dieses Problem auf. Um "Schritt in" die Symboldatei erforderlich ist.

Wenn es sich um Ihren eigenen Code handelt, müssen Sie lediglich überprüfen, ob Ihre Symboldateien vorhanden sind. Mit der Einstellung auf Debuggen auf Projektebene sollte dies möglich sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X