2011-02-03 7 views
8

Estoy intentando depurar un error que el cliente nos ha informado. La stacktrace solo tiene compensaciones de bytes, no números de línea.Encontrar un desplazamiento de bytes en .NET Assembly

p. Ej.

[NullReferenceException:. Referencia a objeto no establecida como una instancia de un objeto]
Foo.Bar (FooFoo de p) 32
Foo.BarBar() 191
Foo.BarBarBar() 15

¿Cómo puedo realizar ingeniería inversa a estos desplazamientos de bytes en líneas de código/llamadas a métodos, etc?

¿Cómo puedo saber dónde se está lanzando la NullReferenceException?

+3

en el futuro se puede enviar aplicación con símbolos de depuración, esto producirá líneas, no se compensan en el seguimiento de la pila – Andrey

+1

No es muy fácil si compiló con las optimizaciones habilitadas. –

+0

+1 en eso. Por lo tanto, no hay razón para tener simbolos de depuración NO compilados. De esta manera, puede enviarlos al cliente. – TomTom

Respuesta

4

Aquí hay una solución que podría funcionar (o puede que no :)). El problema es que la correspondencia entre los números de línea offset y está contenida en el APP (también conocido como los símbolos de depuración)

  1. debe cumplir estrictamente con (importante) misma configuración de construcción como la que se usó para los binarios de barco a cliente. Luego vaya a las propiedades del proyecto, haga clic en "Crear", haga clic en el botón "Avanzado" en la parte inferior de la página. A continuación, busque "Información de depuración" y seleccione "pdb-only"
  2. Cree el proyecto y vaya a la carpeta de salida.
  3. Elija ildasm, agréguelo al PATH o cópielo en algún lado.
  4. En su carpeta de compilación, haga ildasm /LINENUM /SOURCE YourFile.exe. Emitirá IL con compensación y mapeo de línea fuente.

El único problema que veo que usted no será capaz de producir exactamente mismos binarios y de correspondencia pueden fluctate.

3

La única herramienta que puedo recordar en la parte superior de mi cabeza sería .NET Reflector. Abra exactamente el mismo binario que tiene su cliente y cambie el idioma en el cuadro de diálogo Opciones en IL, y debería mostrar (AFAIK) los mismos desplazamientos de bytes como etiquetas en cada línea.

Tendrás que leer IL en lugar de C# o cualquier otra cosa, pero es mejor que nada.

+0

esto no funcionará. Reflector reconstruye C#, no presenta el formato. si tiene líneas vacías en su reflector fuente, no las reproducirá. – Andrey

+0

@Andrey: ¿Te perdiste la parte de la respuesta donde dice "deberás leer IL en lugar de C# ... pero es mejor que nada"? –

+0

@Andrey Reflector puede mostrar el IL - No estoy seguro de cuál es su punto. DO#? –

3
  1. Abra el proyecto en Visual Studio
  2. punto de interrupción Póngase Foo.Bar (FooFoo de p)
  3. Compilar y puede iniciar la depuración. Haga una acción que invocará a Foo.Bar (FooFoo p). Tenga en cuenta que debe usar la configuración que se usó para producir el ensamblado del cliente (debido a la optimización) y, por supuesto, el mismo código fuente
  4. Abrir ventana Pila de llamadas, haga clic derecho y habilite "Mostrar compensaciones de bytes" y deshabilite "Mostrar números de línea"
  5. Paso a través de la función hasta que llegue a algo como "MyAssembly.dll! MyProject.Something.Foo.Bar (FooFoo de p) + 0x32 bytes"(o "+ 0x20 bytes" si su número decimal offset)
  6. Win

Editar: Andreys solución es probablemente mejor Tho :)

+1

+1 para señalar compensaciones de bytes en el depurador –

Cuestiones relacionadas