Zuerst das Problem: Ich habe mehrere freie Projekte, und wie jede Software enthalten sie Fehler. Einige Mitbenutzer melden mir einen Bug-Report mit Stack-Traces. Um das Finden der Fehlerstelle zu vereinfachen, möchte ich Zeilennummern in diesem Stapel anzeigen lassen. Wenn die Anwendung ohne .pdb-Dateien ausgeliefert wird, gehen alle Zeileninformationen verloren. Daher werden derzeit alle meine Projekte mit PDB-Dateien bereitgestellt und die so erzeugten Stack-Traces haben diese Nummern. Aber! Aber ich möchte diese Dateien nicht in der Distribution sehen und alle .pdb entfernen wollen. Sie verwechseln Benutzer verbrauchen Raum im Installateur etc.Stack-Trace mit Zeilennummern aus dem Benutzer-Fehlerbericht in .net neu erstellen?
Delphi Lösung: Vor langer Zeit, als ich ein delphi Programmierer war, habe ich die folgende Technik: auf Ausnahme meine Anwendung zu Fuß auf dem Stapel und sammle Adressen. Dann, wenn ich einen Fehlerbericht erhalte, habe ich ein Werkzeug verwendet, das eine gültige Stapelverfolgung mit Funktionsnamen und Zeilennummern basierend auf gesammelten Adressen und entsprechenden Symboldateien auf meinem Rechner rekonstruiert.
Frage: Gibt es Lib, oder Technik oder was auch immer, um das gleiche in .NET zu tun?
Status-Update: Sehr interessant, dass oft eine Frage zu stellen der beste Weg ist, um Ihre eigenen Untersuchungen zu starten. Ich denke zum Beispiel über dieses Problem seit einiger Zeit nach, aber ich suche erst vor ein paar Tagen nach einer Antwort.
Option 1: MiniDumps. Nachdem ich viel gegoogelt habe, habe ich einen Weg gefunden, Mini-Dumps aus Code zu erstellen und Stacks aus verwalteten Mini-Dumps neu zu erstellen.
- Weitervertreibbarer Montage Mini-Dump Form Code erstellen - clrdump
- Blog-Post über vorherige Anordnung mit - Creating and analyzing minidumps in .NET production applications
Diese Lösung jedoch müssen zwei zusätzliche Baugruppen (~ 1 MB groß) verteilen, und Mini-Dumps benötigen etwas Platz, und es ist unangenehm für den Benutzer, sie per E-Mail zu senden. Für meine Zwecke ist es im Moment nicht akzeptabel.
Option 2: Danke an weiqure for clue. Es ist möglich, verwalteten IL-Offset für jeden Stapelrahmen zu extrahieren. Jetzt besteht das Problem darin, Zeilennummern aus .pdb basierend auf diesen Offsets zu erhalten. Und was habe ich gefunden:
- PDB File Internals, nur für Informationen, weil:
- ISymbolReader - verwaltete Schnittstelle Programm-Datenbank-Dateien
- Und schließlich ein tool to convert .pdb files to structured xml für einfache XPath-Verarbeitung
Mit diesem lesen Werkzeug, ist es möglich, XML-Dateien für jeden Release-Build zu erstellen und sie in Repositary. Wenn eine Ausnahme auf dem Computer des Benutzers auftritt, ist es möglich, eine formatierte Fehlermeldung mit IL-Offsets zu erstellen. Dann sendet der Benutzer diese Nachricht (sehr klein) per Post. Und schließlich ist es möglich, ein einfaches Werkzeug zu erstellen, das den resultierenden Stapel aus einer formatierten Fehlermeldung neu erstellt.
Ich frage mich nur, warum niemand sonst ein Werkzeug wie dieses implementiert? Ich glaube nicht, dass das nur für mich interessant ist.
FYI: In Delphi ist dies jetzt einfach, weil es madExcept gibt, das einen Stapel-Trace und andere nützliche Informationen in einen Bericht über (nicht behandelte) Ausnahmen legt. – schnaader
Welche Option haben Sie gewählt? Ich suche auch selbst nach einer Lösung. – Giorgi
Ich wählte die zweite Option und schreibe eine Menge von Klassen, um den internen Ausnahme-Dump zu ersetzen. Ich plane auch einen Artikel über meine Lösung mit allen Informationen und Quellen zu schreiben. – arbiter