Mostrar el número de líneas en Stack Trace para el ensamblado .NET en modo Release

139

¿Hay alguna manera de mostrar las líneas en el seguimiento de la pila para el ensamblado .NET compilado / implementado en modo Release?

ACTUALIZAR:

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

Los números de línea aún no se muestran en el seguimiento de la pila. ¿Necesito implementar los archivos pdb para todos los proyectos para obtener los números de línea en el seguimiento de la pila?

Solución de trabajo

La implementación del archivo pdb para cada aplicación solucionó el problema del número de línea.

Michael Kniskern
fuente

Respuestas:

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

Implementado con el comentario a continuación:

  • Otra cosa para verificar es en la sección "Paquete / Publicar Web" que la casilla "Excluir símbolos de depuración generados" también está desmarcada
Seguro en sí mismo
fuente
2
¿Tengo que implementar el archivo pdb junto con el ensamblado?
Michael Kniskern
77
Si. Ahí es donde se encuentran los símbolos de depuración y los números de línea.
John Saunders
55
Probablemente no desee exponer esta información si no es necesario. Úselo para depurar el problema de un cliente, sí. Pero no siempre desea hacerlo porque la información de depuración puede revelar datos confidenciales y ser un vector de ataque. Dependiendo de cuál sea tu aplicación.
i_am_jorf
66
@Carlo: la información de depuración también funciona con el código de lanzamiento (optimizado), sin embargo, la depuración es algo limitada ( stackoverflow.com/questions/113866 ). Sin embargo, las pilas de llamadas son bastante confiables incluso en código optimizado, con la excepción de funciones en línea y situaciones ocasionales en las que puede faltar la llamada de cola porque la secuencia de llamada xxx / ret se reemplazó con jmp xxx.
Suma
12
Otra cosa para verificar es en la sección "Paquete / Publicar Web" que la casilla de verificación "Excluir símbolos de depuración generados" también está desmarcada
Gaz
17

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

usuario3250653
fuente
o si es una aplicación de escritorio, asegúrese de que el archivo PDB esté implementado
CAD bloke
9

Me he encontrado con problemas en el pasado donde siento la necesidad de implementar archivos PDB con una versión de lanzamiento para rastrear un error. La razón es, como dijiste, 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 debe refactorizarse en métodos más pequeños y más granulares. No es una respuesta única para todos, pero este enfoque me ha servido bien a corto plazo (a menudo he encontrado el error durante la refactorización) y a la larga.

Solo un pensamiento.

Slolife
fuente
Esta. Y a medida que avanza, realice capturas de prueba en lugares más incompletos con un grano más fino. Y aumente los guardias al comienzo de estas funciones si se deben hacer suposiciones.
Gerard ONeill
A menudo dicho y tan cierto, sin embargo, existe un legado, hay programadores que escriben nuevos métodos grandes y, a veces, un método grande es realmente lo mejor que se puede hacer (dividirlo es confuso o YAGNI). Además, incluso para un método de 5 líneas, limite su búsqueda 5 veces, por lo que los PDB son un mal necesario en la producción a menos que se tome la molestia de usar un servidor de símbolos
FastAl
3

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

Ken Browning
fuente
0

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

Darel
fuente
1
¿Que encontraste? Puede publicar un comentario si no desea publicar una respuesta completa.
jumxozizi
-4

Esto funciona todo el tiempo. Solo necesita subcadenar el mensaje de seguimiento de la pila. Muy fácil! Además, en vb.net necesita 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

Versión C #:

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++;
}
Tim Perry
fuente