c# - ver - Números de línea incorrectos en el seguimiento de pila
ver numero de lineas en sql (2)
¡Gracias a todos por su ayuda! Descubrimos que el agente de SCOM APM que se ejecutaba en las máquinas en producción hizo que nuestra aplicación registrara números de línea incorrectos en los seguimientos de la pila. Tan pronto como desactivamos el agente, los números de línea eran correctos.
El problema
En nuestro sitio web ASP .net, sigo obteniendo números de línea erróneos en los seguimientos de excepciones de la pila. Estoy hablando de nuestro entorno en vivo. Parece que hay un patrón: la traza de la pila siempre apuntará a la línea que contiene los corchetes de cierre del método.
Por ejemplo:
public class Foo
{
public void Bar()
{
object someObject = null;
someObject.ToString();
/*
arbitrarily more lines of code
*/
} // this line will be the one that the stack trace points to
}
Más detalles
Para que quede claro: esto no solo sucede con algunos métodos, sino con todas las excepciones que registramos. Por lo tanto, descartaría las optimizaciones (JIT) aquí, que podrían llevar a que los números de línea parezcan aleatoriamente aparentes. Lo que me molesta es que los números de línea equivocados parecen apuntar constantemente a los corchetes de cierre del método de contención.
Tenga en cuenta que antes de .net 4.6, en realidad había un error en el marco, por ejemplo, si compilaba la orientación x64, esto sucedería exactamente. Sin embargo, Microsoft confirmó que esto ha sido arreglado. También ejecuta una aplicación de ejemplo mínima para esto, reafirma su afirmación. Pero por alguna razón todavía sucede en los servidores web.
Me desconcierta aún más que no suceda en nuestros entornos de prueba y desarrollo. La prueba y los sistemas en vivo están configurados de manera similar. La única diferencia real es que en vivo estamos ejecutando Windows Server 2012, mientras que en el sistema de prueba todavía estamos usando Windows Server 2008.
Lo que he comprobado
- Los archivos pdb son válidos (probados con chkmatch)
- Compilación de código de tiempo optimizaciones no son el problema
- El error mencionado en .net antes de 4.6 no se puede reproducir con un ejemplo mínimo
- Las versiones .NET son exactamente iguales
- La compilación viene del mismo script de implementación
Cualquier pista para resolver este problema es muy apreciada. Si sabe algo que podamos verificar, hágamelo saber.
La optimización de la compilación, así como la optimización en tiempo de ejecución, pueden cambiar la ejecución real, así como la información de la pila de llamadas construida. Así que no puedes tratar los números tan seriamente.
Se puede encontrar más información en publicaciones como la de Scott Hanselman: la versión NO ES depuración: optimizaciones de 64 bits y el método C # en las pilas de llamadas de compilación de la versión .
Sería demasiado difícil solucionar un caso específico sin tocar tus bits. Pero si conoce WinDbg, puede profundizar más, depurando en vivo la aplicación cuando se produce la excepción. Luego puede volcar el código de máquina real jiteado así como otra información de tiempo de ejecución, para determinar cómo se construye el número de línea.