Wir verwenden System.Reflection.Emit, um Code zur Laufzeit aus Quellcode zu generieren (ja - wie in einem Compiler). Wir stellen dem ILGenerator mit MarkSequencePoint usw. korrekte Symbolinformationen zur Verfügung und aktivieren alle Debug-Flags im AssemblyBuilder. Die Assembly wird im selben Prozess im Speicher gehalten, der sie kompiliert hat und direkt ausgeführt wird. Wenn der Debugger von Visual Studio verwendet wird, um die Quelle für den dynamisch generierten Code zu durchlaufen, funktioniert er tatsächlich perfekt, und Visual Studio scheint zu wissen, woher Code in Bezug auf Dateien und Zeilennummern kommt.Falscher Dateipfad und Zeilennummer in Exception-Stack-Traces aus dynamischem Code
JEDOCH - Wenn Ausnahmen vom generierten Code geworfen werden, enthalten die System.Exception Objekte Stack-Traces, die völlig falsch sind. Sie verweisen auf andere (gültige, aber falsche) Dateien und Zeilennummern. Es ruft den Namen der Klasse und der Methode ab, aber die angegebene Datei- und Zeilennummer hat nichts mit dem Codepfad zu tun, von dem die Ausnahme tatsächlich stammt.
Die Dateien, auf die gezeigt wird, sind so unabhängig, dass sie nicht mit Inlining oder Optimierungen verknüpft werden können. Das einzige Muster, das ich erkennen kann, ist, dass es scheinbar von einigen Dateien versetzt wird (in einer imaginären alphabetisch sortierten Liste von Quelldateien, aus denen die Assembly gebaut wurde). Dieses Muster ist jedoch nicht zu 100% konsistent, und es erscheint irrational, dass dies mit der Ursache des Problems verknüpft ist.
Wenn ich ein System.Diagnostics.Debug-Objekt aus der Ausnahme erstellen, enthält es die gleichen fehlerhaften Informationen.
Ich nehme an, dass die .NET-Laufzeit die gleichen Metadaten verwendet, um Exception Stack-Traces zu erstellen, wie der Debugger zum Durchlaufen des Codes verwendet. In diesem Fall ist dieses Verhalten wirklich seltsam.
Ich versuche herauszufinden, ob dies ein bekannter Fehler in .NET ist, wenn es um dynamische In-Memory-Assemblies geht, oder wenn jemand ähnliche Probleme in anderen Bereichen gesehen hat.
Sie könnten ein kleines und vollständiges Programm veröffentlichen, das wir testen könnten?Sie könnten zum Beispiel eine "Sprache" aus zwei Zeilen oder so programmieren, dass Sie keinen vollständigen Compiler schreiben müssten. –
Kompilieren Sie mit der 'optimize' Flagge? – Andrew
Andrew: Auf dem Compiler oder auf dem Assemblybuilder? Ich habe versucht, so viele "Ja, ich möchte so viele Debug-Informationen wie möglich" Flags wie möglich zu setzen, aber ich bin mir vielleicht nicht alle bewusst. – Duckers