2009-03-10 10 views
119

¿Hay alguna manera de mostrar las líneas en el seguimiento de la pila para .NET assembly build/deployed en modo Release?Mostrar el número de líneas en Stack Trace para el ensamblado .NET en el modo de lanzamiento

ACTUALIZACIÓN:

Mi aplicación se divide en tres proyectos de biblioteca de clases y un proyecto ASP.NET "sitio web". El error que trato de rastrear está en uno de los tres proyectos de biblioteca de clase. Solo implementé el archivo pdb para el proyecto de biblioteca de clase que está generando el error "Referencia de objeto no configurado a una instancia de un objeto".

Los números de línea todavía no aparecen en el seguimiento de la pila. ¿Debo implementar los archivos pdb para que todos los proyectos obtengan los números de línea en el seguimiento de la pila?

Solución de trabajo

Despliegue del archivo pdb para cada aplicación fija el tema número de línea.

Respuesta

119
  • Vaya a la ventana de Propiedades para el proyecto donde desea ver los números de línea de seguimiento de la pila.
  • Haz clic en la pestaña vertical "Crear".
  • Seleccione la configuración "Liberar". Compruebe el parámetro constante DEBUG.
  • Desmarque el parámetro "Optimizar código" para evitar el problema de rastreo ocasional con el código en línea (este paso no es esencial).
  • Presione el botón Avanzado ... y elija Salida -> Información de depuración -> pdb-only.
  • Despliegue el archivo .pdb generado con el conjunto.

implementado con el comentario anterior:

  • Otra cosa a comprobar es en la sección "Paquete/Publicar Web" que la casilla de verificación "Excluir símbolos de depuración generados" también está marcada
+2

¿Debo implementar el archivo pdb junto con el conjunto? –

+7

Sí. Ahí es donde están los símbolos de depuración y los números de línea. –

+4

Probablemente no desee exponer esta información si no es necesario. Úselo para depurar un problema de los clientes, sí. Pero no siempre deseas hacerlo porque la información de depuración puede revelar datos confidenciales y ser un vector de ataque. Según cuál sea tu aplicación –

3

Incluya los símbolos de depuración con su paquete de compilación/implementación.

1

En VS 2008 Express, lo encontré en Propiedades del proyecto -> Compilar -> Opciones de compilación avanzadas.

+0

¿Qué encontró? Puede publicar un comentario si no desea publicar una respuesta completa. – jumxozizi

7

me he encontrado con problemas en el pasado donde me siento la necesidad de desplegar archivos PDB con una versión de lanzamiento con el fin de localizar a un error. La razón es, como dijiste, fue que la excepción ocurrió en un método que era muy grande y no pude determinar con precisión dónde estaba sucediendo.

Esto podría ser una indicación de que el método necesita ser refactorizado en métodos más pequeños y más granulares. No es una respuesta única para todos, pero este enfoque me ha sido útil a corto plazo (a menudo he encontrado el error durante la refactorización) y, a largo plazo.

Solo un pensamiento.

+0

Esto. Y a medida que avanzas, lanza capturas de prueba en lugares más incompletos con un grano más fino. Y aumente las guardias al comienzo de estas funciones si se tienen que hacer suposiciones. –

+0

A menudo dicho y tan cierto, sin embargo, hay legado, hay programadores que escriben nuevos métodos grandes, y en ocasiones un método grande es en realidad lo mejor (dividirlo es confuso o YAGNI). Además, incluso para un método de 5 líneas: reduce su búsqueda 5x, por lo que los PDB son un mal necesario en la producción a menos que se tome el trabajo de usar un servidor de símbolos – FastAl

15

En VS2012, debe desmarcar "Excluir símbolos de depuración generados" en la sección Paquete/Publicar web de las propiedades también.

-3

Esto funciona todo el tiempo. Solo necesita subscribir el mensaje de seguimiento de la pila. ¡Real Easy! Además, en vb.net debe hacer "Mostrar todos los archivos" e incluir el pdb.

'Err is the exception passed to this function 

Dim lineGrab As String = err.StackTrace.Substring(err.StackTrace.Length - 5) 
Dim i As Integer = 0 
While i < lineGrab.Length     
    If (IsNumeric(lineGrab(i))) Then 
     lineNo.Append(lineGrab(i)) 
    End If 
    i += 1 
End While 

'LineNo holds the number as a string 

C# versión:

string lineGrab = error.StackTrace.Substring(error.StackTrace.Length - 5); 

int i = 0; 
int value; 
while (i < lineGrab.Length) 
{ 
    if (int.TryParse(lineGrab[i].ToString(), out value)) 
    { 
     strLineNo.Append(lineGrab[i]); 
    } 
    i++; 
} 
+0

Sí, no formateó muy bien ... lo siento por eso –

-2

try { // your method } catch (Exception ex) { // log-> ex.ToString(); // it will give you whole exception including line number and
// file name }
Plus Incluir archivo .pdb (de carpeta bin) en el despliegue para obtener toda excepción de otra forma se mostrará sólo el nombre de método en el que se produce una excepción.

Cuestiones relacionadas