c# - Cómo obtener número(s) de línea en el StackTrace de una excepción lanzada en.NET para aparecer
exception stack-trace (6)
Además de las otras grandes 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 garantizar que el directorio de producción bin coincida con el directorio bin del desarrollo en todos los aspectos (excepto para los archivos XML).
MSDN dice esto sobre la propiedad StackTrace
de la clase Exception
:
La propiedad StackTrace contiene un seguimiento de pila, que puede usar para determinar en qué parte del código se produjo el error. 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.
Entonces 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.
Para obtener los números de línea en StackTrace, debe tener la información de depuración correcta (archivos PDB) junto con sus dlls / exes. Para generar la información de depuración, configure la opción en Project Properties -> Build -> Advanced -> Debug Info
:
Establecerlo en su full
debería ser suficiente (consulte el cuadro de diálogo Configuración de compilación avanzada para ver lo que hacen las otras opciones). 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 compilaciones de lanzamiento 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 adjuntar 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 hechas por el compilador o el compilador JIT (esto es especialmente así si los números de línea se muestran como 0).
Parece haber encontrado la solución. En VS2010, al menos, con la información de depuración de salida configurada como completa, 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 las excepciones aparecen con los números de línea.
Puede intentar lo siguiente, dado que hay un archivo pdb para el ensamblaje:
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();
}
Si tiene una aplicación web o proyecto de servicio web utilizando VS2012 o posterior, no funcionará cambiar la configuración de compilación. En cambio, debes seguir los consejos de este artículo:
Sitio web de Visual Studio 2012 Publicar archivos .pdb que no se están copiando
Específicamente, debe incluir la siguiente configuración en
<YOUR_PROJECT>/Properties/PublishProfiles/*.pubxml
archivo (s) para su proyecto:
<PropertyGroup>
<ExcludeGeneratedDebugSymbol>False</ExcludeGeneratedDebugSymbol>
</PropertyGroup>
Tienes que construir 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.