2010-09-24 18 views
25

MSDN dice esto acerca de la propiedad de la clase StackTraceException:Cómo obtener el número (s) de línea en el StackTrace de una excepción lanzada en .NET a aparecer

La propiedad tiene una pila StackTrace rastro , que puede usar para determinar donde se produjo el error en el código. StackTrace enumera todos los métodos llamados que precedieron a la excepción y los números de línea en la fuente donde se realizaron las llamadas.

Así sé que esta información está disponible. ¿Cómo obtengo los números de línea para que realmente aparezcan en el seguimiento de la pila? Mi código arroja una excepción en un código muy difícil y complejo que atraviesa TONELADAS de objetos, así que no quiero pasar miles de veces para ver dónde está ocurriendo la excepción. La traza de pila de la excepción solo muestra firmas de método y no números de línea.

+0

Si está depurando el código, puede decirle a Visual Studio que rompa la excepción en el menú Depurar. –

+2

Si supiera el número de línea donde se lanzó la excepción, podría hacerlo. –

Respuesta

31

Para obtener los números de línea en el StackTrace, debe tener la información de depuración correcta (archivos PDB) junto con sus dlls/exes. Para generar la información de la depuración, establezca la opción en Project Properties -> Build -> Advanced -> Debug Info:

alt text

lo establece a full debería ser suficiente (ver el Advanced Build Settings Dialog Box docs por lo que las otras opciones hacen). La información de depuración (es decir, los archivos PDB) se genera para las configuraciones de compilación de depuración de forma predeterminada, pero también se puede generar para las configuraciones de compilación de versiones.

La generación de PDB para versiones liberadas le permite enviar su código sin los PDB, pero dejar los PDB al lado de los dlls si necesita números de línea (o incluso para conectar un depurador remoto). Una cosa a tener en cuenta es que en una compilación de lanzamiento, los números de línea pueden no ser del todo correctos debido a las optimizaciones realizadas por el compilador o el compilador JIT (esto es especialmente así si los números de línea se muestran como 0).

+1

MSDN dice que no puede depurar remotamente a menos que configure/depure: completo. Me pregunto si esto significa que si configura/depura: completo puede adjuntar y depurar con la fuente incluso sin el código fuente y/debug: pdbonly es suficiente si tiene la fuente y no le molesta el error de ubicación ocasional del punto de ejecución. – axk

+10

Esto no parece funcionar, lo tengo activado pero no hay números de línea en mis seguimientos de pila. – msbg

+2

@msbg - 1). ¿Estás seguro de que lo configuraste para compilaciones de depuración y LIBERACIÓN? 2). Los números de línea solo se mostrarán para su código ... así: my_code.temp.cmdBoom_Click (Object remitente, EventArgs e) en TestApp \ test.aspx.cs: línea 1245 en System.Web.UI.WebControls.Button.OnClick (EventArgs e) en System.Web.UI.WebControls.Button.RaisePostBackEvent (String eventArgument) en System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent (String eventArgument) ... también ¿Desmarcaste "Optimizar Código"? – mike

5

Tienes que compilar el proyecto con archivos pdb habilitados y asegurarte de que implementes los archivos pdb con tu aplicación. Puede comprobar si los archivos pdb se están construyendo para su configuración haciendo clic con el botón derecho en el conjunto para el que necesita archivos pdb, luego vaya a Propiedades> Compilar> Avanzado y asegúrese de que en Información de depuración de salida esté configurado como lleno.

+1

Mis PDB están ahí, y todo está configurado correctamente. Todavía no ir. –

-10

Parece haber encontrado la solución. En VS2010 al menos, con la información de depuración de salida establecida en lleno, tampoco obtuve los números de línea dentro de las excepciones. El truco parece ser activar los números de línea dentro del editor. (Herramientas -> Opciones -> Editor de texto -> Todos los idiomas -> General -> Pantalla -> Números de línea)

Ahora aparecen excepciones con números de línea.

+1

hola, no creo que esto tenga sentido ... – Yuki

+2

Esto es mostrar los números de línea, no los números de línea en un rastro de pila. – RemarkLima

0

Además de las otras excelentes sugerencias, estábamos implementando en IIS. Tuvimos un servidor intermedio y un servidor de producción. Parecían idénticos, excepto que la puesta en escena nos dio números de línea y la producción no. Resultó que había una DLL adicional en el directorio bin de producción (resultó ser SqlServerSpatial.dll fwiw) y una vez que se movió al sistema, los números de línea comenzaron a aparecer en la producción.

La lección fue asegurar que el directorio de producción bin coincida con el directorio bin del desarrollo en todos los aspectos (excepto para los archivos XML).

5

Si tiene una aplicación web o un proyecto de servicio web que utiliza VS2012 o posterior, no funcionará cambiar la configuración de compilación. En su lugar, usted debe seguir los consejos de este artículo:

Visual Studio 2012 Website Publish Not Copying .pdb files

En concreto, se debe incluir la siguiente configuración en el archivo (s)

<YOUR_PROJECT>\Properties\PublishProfiles\*.pubxml 

para su proyecto:

<PropertyGroup> 
    <ExcludeGeneratedDebugSymbol>False</ExcludeGeneratedDebugSymbol> 
</PropertyGroup> 
+0

Si * está * usando MSBuild, p. con la configuración * Package * y Web Deploy, puede agregar el mismo elemento '' al archivo * .csproj * de su proyecto web. –

4

Puede intentar lo siguiente, dado que hay un archivo pdb para el conjunto:

try 
{ 
    throw new Exception(); 
} 
catch (Exception ex) 
{ 
    // Get line number from the stack trace's top frame for the exception with source file information 
    int linenumber = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber(); 
} 
Cuestiones relacionadas