2011-01-31 31 views
5

He escrito un módulo logger/exceptionfactory, que usa System.Diagnostics.StackTrace, para obtener atributos de los métodos de llamada y sus tipos de declaración. Sin embargo, noté que si ejecutaba el código fuera de Visual Studio en el modo de lanzamiento, algunos de mis métodos más cortos se filtran y faltan en el seguimiento de la pila. Ahora no tengo manera de probar si un método se incluirá en el tiempo de ejecución, pero no quiero [MethodImpl(MethodImplOptions.NoInlining)] cada método importante. Pero si un método de mis clases base falta debido a él, puedo leer mal la capa y la información de operación y eso podría llevar a un registro falso o excepciones mal parametrizadas.Stack Trace para iniciar sesión en .NET

¿Existe una regla de oro para saber dónde y cuándo se inserta? ¿Los métodos virtuales, los métodos estáticos, los métodos de clase base son tratados de manera diferente? ¿Solo tengo que preocuparme por la inclusión en el interior del ensamblaje? ¿Dentro del espacio de nombres?

+0

posible duplicado de [¿Cuándo es un método elegible para ser incluido por el CLR?] (Http://stackoverflow.com/questions/4660004/when-is-a-method-eligible-to-be-inlined-by -the-clr) –

Respuesta

5

Sí, hay algunas reglas, pero son heurísticas utilizadas por el compilador JIT y estas heurísticas pueden cambiar en cualquier momento.

  1. Los métodos virtuales no se pueden incluir.
  2. Los métodos de interfaz, por otro lado, pueden estar en línea, aunque no estoy 100% seguro de si esto colapsará el seguimiento de la pila.
  3. Los métodos estáticos y los métodos de instancia no virtuales ciertamente pueden incluirse.
  4. La alineación puede cruzar espacios de nombres (por supuesto) y ensamblados (no tan obvios) porque ocurre en tiempo de ejecución, cuando el JIT compila la llamada al método.
  5. Los métodos "pesados" no se incluirán en la línea. Esto depende de la definición de "pesado", y es parte de la heurística que aplica el JIT.

Algunas de las heurísticas para "pesada" que yo sepa:

  • métodos que utilizan manejo de excepciones (es decir try-catch-o probar finalmente se hace) no están inline.
  • Los métodos con código grande (~ 32 bytes IL pero puedo recordar esto incorrecto) no están en línea.
  • Los métodos con bucles no están incluidos (a menos que el bucle se pueda desenrollar o eliminar por completo).
+0

simplemente perfecto que :). Todos mis métodos importantes comienzan con try catch ... – TDaver

2

Las heurísticas son todos los detalles de implementación de la fluctuación de fase, lo que significa que no están documentados oficialmente y que, presumiblemente, están sujetos a cambios en cualquier momento.

Dicho esto, aquí hay algunos artículos que puedes encontrar interesantes (aunque algunos de ellos son un poco largo en el diente ahora):

Cuestiones relacionadas