Zeigen Sie die Zeilennummer in der Stapelverfolgung für die .NET-Assembly im Freigabemodus an

139

Gibt es eine Möglichkeit, die Zeilen im Stack-Trace für die im Release-Modus erstellte / bereitgestellte .NET-Assembly anzuzeigen?

AKTUALISIEREN:

Meine Anwendung ist in drei Klassenbibliotheksprojekte und ein ASP.NET-Website-Projekt unterteilt. Der Fehler, den ich aufzuspüren versuche, liegt in einem der drei Klassenbibliotheksprojekte. Ich habe die pdb-Datei nur für das Klassenbibliotheksprojekt bereitgestellt, das den Fehler "Objektreferenz nicht auf eine Instanz eines Objekts festgelegt" generiert.

Die Zeilennummern werden im Stack-Trace immer noch nicht angezeigt. Muss ich die pdb-Dateien für alle Projekte bereitstellen, um die Zeilennummern im Stack-Trace zu erhalten?

Arbeitslösung

Durch die Bereitstellung der PDF-Datei für jede Anwendung wurde das Problem mit der Zeilennummer behoben.

Michael Kniskern
quelle

Antworten:

147
  • Gehen Sie in das Eigenschaftenfenster für das Projekt, in dem Sie die Stack-Trace-Zeilennummern anzeigen möchten.
  • Klicken Sie auf die Registerkarte "Vertikal erstellen".
  • Wählen Sie "Release" -Konfiguration. Überprüfen Sie den Parameter DEBUG-Konstante.
  • Deaktivieren Sie den Parameter "Code optimieren", um das gelegentliche Trace-Problem mit Inline-Code zu vermeiden (dieser Schritt ist nicht unbedingt erforderlich).
  • Klicken Sie auf die Schaltfläche Erweitert ... und wählen Sie Ausgabe -> Debug-Informationen -> Nur PDF.
  • Stellen Sie die generierte PDF-Datei mit der Assembly bereit.

Implementiert mit dem Kommentar unten:

  • Eine andere zu überprüfende Sache ist im Abschnitt "Web packen / veröffentlichen", dass das Kontrollkästchen "Generierte Debug-Symbole ausschließen" ebenfalls deaktiviert ist
Coxy
quelle
2
Muss ich die pdb-Datei zusammen mit der Assembly bereitstellen?
Michael Kniskern
7
Ja. Dort befinden sich die Debug-Symbole und Zeilennummern.
John Saunders
5
Sie möchten diese Informationen wahrscheinlich nicht verfügbar machen, wenn Sie dies nicht müssen. Verwenden Sie es, um ein Client-Problem zu debuggen, ja. Sie möchten dies jedoch nicht immer tun, da das Debuggen von Informationen vertrauliche Daten preisgeben und ein Angriffsvektor sein kann. Je nachdem, was Ihre App ist.
i_am_jorf
6
@Carlo: Debug-Informationen funktionieren auch mit (optimiertem) Release-Code, das Debuggen ist jedoch etwas eingeschränkt ( stackoverflow.com/questions/113866 ). Callstacks sind jedoch auch in optimiertem Code ziemlich zuverlässig, mit Ausnahme von Inline-Funktionen und gelegentlichen Situationen, in denen ein Tail-Call fehlen kann, weil die Aufruf-xxx / ret-Sequenz durch jmp xxx ersetzt wurde.
Suma
12
Eine andere Sache, die überprüft werden muss, ist im Abschnitt "Web packen / veröffentlichen", dass das Kontrollkästchen "Generierte Debug-Symbole ausschließen" ebenfalls deaktiviert ist
Gaz
17

In VS2012 müssen Sie auch im Abschnitt "Paket / Web veröffentlichen" der Eigenschaften das Kontrollkästchen "Generierte Debug-Symbole ausschließen" deaktivieren.

user3250653
quelle
oder wenn es sich um eine Desktop-App handelt, stellen Sie sicher, dass die PDB-Datei bereitgestellt ist
CAD-Typ
9

Ich bin in der Vergangenheit auf Probleme gestoßen, bei denen ich das Bedürfnis verspüre, PDB-Dateien mit einem Release-Build bereitzustellen, um einen Fehler aufzuspüren. Der Grund ist, wie Sie sagten, dass die Ausnahme bei einer sehr großen Methode auftrat und ich nicht genau bestimmen konnte, wo sie stattfand.

Dies könnte ein Hinweis darauf sein, dass die Methode in kleinere, detailliertere Methoden umgestaltet werden muss. Keine einheitliche Antwort passt, aber dieser Ansatz hat mir kurzfristig (ich habe den Fehler beim Refactoring oft gefunden) und langfristig gute Dienste geleistet.

Nur ein Gedanke.

Slolife
quelle
Dies. Und wenn Sie gehen, werfen Sie versuchen Fänge an skizzenhafteren Stellen mit einer feineren Körnung. Und erhöhen Sie die Wachen zu Beginn dieser Funktionen, wenn Annahmen getroffen werden müssen.
Gerard ONeill
Oft gesagt und so wahr, aber es gibt Vermächtnis, es gibt Programmierer, die neue große Methoden schreiben, und manchmal ist eine große Methode tatsächlich das Beste (Aufteilen ist verwirrend oder YAGNI). Selbst für eine 5-Zeilen-Methode - Sie schränken Ihre Suche 5x ein - sind PDBs ein notwendiges Übel in der Produktion, es sei denn, Sie haben die
Mühe
3

Fügen Sie Ihrem Build- / Bereitstellungspaket Debug-Symbole hinzu.

Ken Browning
quelle
0

In VS 2008 Express fand ich es unter Projekteigenschaften -> Kompilieren -> Erweiterte Kompilierungsoptionen.

Darel
quelle
1
Was hast du gefunden? Sie können einen Kommentar veröffentlichen, wenn Sie keine vollständige Antwort veröffentlichen möchten.
Jumxozizi
-4

Dies funktioniert jedes Mal. Sie müssen nur die Stack-Trace-Nachricht mit einem Teilstring versehen. Ganz einfach! Außerdem müssen Sie in vb.net "Alle Dateien anzeigen" ausführen und die PDF-Datei einschließen.

'Err is the exception passed to this function

Dim lineGrab As String = err.StackTrace.Substring(err.StackTrace.Length - 5)
Dim i As Integer = 0
While i < lineGrab.Length                   
    If (IsNumeric(lineGrab(i))) Then
        lineNo.Append(lineGrab(i))
    End If
    i += 1
End While

'LineNo holds the number as a string

C # -Version:

string lineGrab = error.StackTrace.Substring(error.StackTrace.Length - 5);

int i = 0;
int value;
while (i < lineGrab.Length)
{
    if (int.TryParse(lineGrab[i].ToString(), out value))
    {
        strLineNo.Append(lineGrab[i]);
    }
    i++;
}
Tim Perry
quelle