Suchen Sie einen Byte-Offset in einer .NET Assembly

8

Ich versuche einen Fehler zu beheben, den der Client uns gemeldet hat. Der Stacktrace hat nur Byte-Offsets, keine Zeilennummern.

z.B.

  

[NullReferenceException: Objektreferenz wurde nicht auf eine Instanz eines Objekts gesetzt.]
     Foo.Bar (FooFoo p) +32
     Foo.BarBar () +191
     Foo.BarBarBar () +15

Wie kann ich diese Byte-Offsets in Zeilen von Code- / Methodenaufrufen usw. zurückentwickeln?

Wie kann ich herausfinden, wo die NullReferenceException geworfen wird?

    
Greg B 03.02.2011, 12:33
quelle

3 Antworten

4

Hier ist eine Lösung, die funktionieren könnte (oder auch nicht :)). Das Problem ist, dass die Zuordnung zwischen Offset und Zeilennummern in pdb enthalten ist (aka die Debug-Symbole)

  1. Nimm genau (wichtig) dieselbe Build-Konfiguration wie diejenige, die verwendet wurde, um Binärdateien zum Client zu senden. Dann gehen Sie zu den Projekteigenschaften, Registerkarte "Build", klicken Sie auf den Button "Advanced" am unteren Rand der Seite. Dann finden Sie "Debug Info" und wählen Sie "pdb-only"
  2. Erstellen Sie das Projekt und gehen Sie zum Ausgabeordner.
  3. Wählen Sie ildasm , fügen Sie es entweder zu PATH hinzu oder kopieren Sie es irgendwo hin.
  4. Mach in deinem Build-Ordner ildasm /LINENUM /SOURCE YourFile.exe . Es wird IL mit Offset- und Quelllinienzuordnung ausgeben.

Das einzige Problem, das ich sehe, dass Sie nicht in der Lage sein werden, genau gleiche Binärdateien und Mappings zu erzeugen, kann schwanken.

    
Andrey 03.02.2011, 12:44
quelle
3

Das einzige Werkzeug, an das ich mich von ganzem Herzen erinnern kann, ist der .NET Reflektor . Öffnen Sie die exakt gleiche Binärdatei, die Ihr Client enthält, und ändern Sie die Sprache im Dialogfeld Optionen in AWL, und es sollte (AFAIK) die gleichen Byte-Offsets wie die Beschriftungen in jeder Zeile anzeigen.

Sie müssen IL anstelle von C # lesen oder etwas anderes, aber es ist besser als nichts.

    
Matti Virkkunen 03.02.2011 12:40
quelle
3
  1. Öffnen Sie Ihr Projekt im Visual Studio
  2. Setzen Sie den Haltepunkt auf Foo.Bar (FooFoo p)
  3. Kompilieren und starten Sie das Debugging. Aktion ausführen, die Foo.Bar (FooFoo p) aufruft. Beachten Sie, dass Sie die Konfiguration verwenden müssen, die zur Erstellung der Client-Assembly (aufgrund der Optimierung) und natürlich des gleichen Quellcodes verwendet wurde
  4. Öffnen Sie das Call Stack-Fenster, klicken Sie mit der rechten Maustaste und aktivieren Sie "Show offset offsets" und deaktivieren Sie "Show line numbers"
  5. Durchgehen Sie die Funktion, bis Sie etwas wie "MyAssembly.dll! MyProject.Something.Foo.Bar (FooFoo p) + 0x32 bytes" (oder "+ 0x20 bytes" wenn Ihre Offset-Dezimalzahl)
  6. getroffen haben
  7. Gewinne

Edit: Andreys Lösung ist wahrscheinlich besser tho:)

    
Lukáš Novotný 03.02.2011 12:54
quelle

Tags und Links