38 Stimmen

Wie man Zeilennummern im StackTrace einer in .NET ausgelösten Ausnahme angezeigt bekommt

MSDN sagt dies über die StackTrace-Eigenschaft der Exception-Klasse:

Die StackTrace-Eigenschaft enthält einen Stacktrace, den Sie verwenden können, um festzustellen, wo im Code der Fehler aufgetreten ist. StackTrace listet alle aufgerufenen Methoden auf, die der Ausnahme vorausgingen, sowie die Zeilennummern im Quellcode, wo die Aufrufe gemacht wurden.

Also weiß ich, dass diese Information verfügbar ist. Wie bekomme ich die Zeilennummern tatsächlich im Stacktrace angezeigt? Mein Code wirft eine Ausnahme in einem sehr schwierigen und komplexen Codeabschnitt, der DURCH HAUFEN von Objekten durchgeht, sodass ich nicht tausendmal durchlaufen möchte, um zu sehen, wo die Ausnahme passiert. Der Stacktrace der Ausnahme zeigt nur Methodensignaturen und keine Zeilennummern an.

47voto

adrianbanks Punkte 78849

Um die Zeilennummern im StackTrace zu erhalten, müssen Sie die richtigen Debug-Informationen (PDB-Dateien) neben Ihren DLLs/EXEs haben. Um die Debug-Informationen zu generieren, setzen Sie die Option in Projekteigenschaften -> Erstellen -> Erweitert -> Debug-Infos:

alt text

Es sollte ausreichen, es auf full zu setzen (siehe die Dokumentation zum Dialogfeld Erweiterte Build-Einstellungen, um zu erfahren, was die anderen Optionen tun). Debug-Informationen (d.h. PDB-Dateien) werden standardmäßig für Debug-Build-Konfigurationen generiert, können aber auch für Release-Build-Konfigurationen generiert werden.

Das Generieren von PDBs für Release-Builds ermöglicht es Ihnen, Ihren Code ohne die PDBs zu versenden, aber die PDBs neben den DLLs abzulegen, wenn Sie Zeilennummern benötigen (oder sogar einen Remote-Debugger anhängen möchten). Eines ist zu beachten: In einem Release-Build sind die Zeilennummern möglicherweise nicht ganz korrekt aufgrund von Optimierungen, die vom Compiler oder JIT-Compiler vorgenommen wurden (insbesondere dann, wenn die Zeilennummern als 0 angezeigt werden).

7voto

chridam Punkte 94546

Sie könnten Folgendes ausprobieren, wenn es eine pdb-Datei für die Assembly gibt:

versuchen
{
    throw new Exception();
}
fang an (Exception ex)
{
    // Zeilennummer aus dem obersten Rahmen des Stack-Traces für die Ausnahme mit Quelldateiinformationen abrufen
    int zeilennummer = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
}

6voto

Jaimal Chohan Punkte 8301

Sie müssen das Projekt mit aktivierten pdb-Dateien erstellen und sicherstellen, dass Sie die pdb-Dateien mit Ihrer Anwendung bereitstellen. Sie können überprüfen, ob tatsächlich pdb-Dateien für Ihre Konfiguration erstellt werden, indem Sie mit der rechten Maustaste auf das Assembly klicken, für das Sie pdb-Dateien benötigen, dann zu Eigenschaften > Erstellen > Erweitert gehen und sicherstellen, dass unter Ausgabe-Debug-Info auf "Voll" eingestellt ist.

6voto

Peter Gluck Punkte 8062

Wenn Sie ein Webanwendungs- oder Webdienstprojekt mit VS2012 oder neuer haben, funktioniert es nicht, die Build-Einstellungen zu ändern. Stattdessen sollten Sie dem Rat in diesem Artikel folgen:

Visual Studio 2012 Website Publish kopiert keine .pdb-Dateien

Insbesondere sollten Sie die folgende Einstellung in der

\Properties\PublishProfiles\*.pubxml

Datei(en) für Ihr Projekt einschließen:

  False

1voto

DJA Punkte 611

Weiter zu den anderen großartigen Vorschlägen, wir haben auf IIS bereitgestellt. Wir hatten einen Staging-Server und einen Produktions-Server. Sie schienen identisch zu sein, außer dass Staging uns Zeilennummern lieferte und Produktions nicht. Es stellte sich heraus, dass es eine zusätzliche DLL im bin-Verzeichnis der Produktion gab (es handelte sich zufällig um SqlServerSpatial.dll fwiw) und sobald sie in das Systemverzeichnis verschoben wurde, begannen die Zeilennummern auf Produktion angezeigt zu werden.

Die Lektion bestand darin, sicherzustellen, dass das bin-Verzeichnis der Produktion in jeder Hinsicht mit dem bin-Verzeichnis der Entwicklung übereinstimmt (außer für XML-Dateien).

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