Pregunta

¿Es posible que el depurador (o el controlador de excepciones CLR) para mostrar la línea en la que ocurrió la excepción en modo de lanzamiento utilizando el AP?

El código, en modo de lanzamiento, está optimizado y no siempre siguen el orden y la lógica del código "original".

También es sorprendente que el depurador puede navegar a través de mi código paso a paso, incluso en modo de lanzamiento. La optimización debe hacer la navegación muy inconfortable.

¿Podrían aclarar esos dos puntos para mí?

¿Fue útil?

Solución

No estoy tan familiarizado con cómo se hace esto con CLR, pero es probablemente muy similar a como se hace con código nativo. Cuando el compilador genera instrucciones de la máquina, se agrega entradas a la AP que básicamente dice "la instrucción en la dirección actual, X, vino de la línea 25 en foo.cpp".

El depurador sabe qué dirección de programa se está ejecutando actualmente. Así que parece un poco de dirección, X, en el AP y ve que venía de la línea 25 en foo.cpp. El uso de este, que es capaz de "paso" a través de su código fuente.

Este proceso es el mismo, independientemente de depuración o modo de lanzamiento (a condición de que un pdb se genera en absoluto en modo de lanzamiento). Tiene usted razón, sin embargo, que muchas veces en modo de lanzamiento debido a las optimizaciones del depurador no paso "lineal" a través del código. Podría saltar a diferentes líneas de forma inesperada. Esto se debe al cambio del orden de las instrucciones optimizador, pero no cambia la asignación de dirección a la fuente de línea, por lo que el depurador es todavía capaz de seguirlo.

Otros consejos

[@ No estoy seguro] tiene casi la derecha. El compilador hace un mayor esfuerzo en la identificación de un número de línea apropiado que se acerque a la instrucción de código máquina actual.

El AP y el depurador no se sabe nada acerca de optimizaciones; el archivo PDB mapas de ubicaciones de direcciones esencialmente en el código de máquina a números de líneas de código fuente. En código optimizado, que no siempre es posible hacer coincidir exactamente una instrucción de montaje a una línea específica del código fuente, por lo que el compilador escribir en el AP lo más parecido que tiene a mano. Esto podría ser "la línea de código fuente antes", o "la línea de código fuente del contexto circundante (circular, etc.)" o algo más.

En cualquier caso, el depurador esencialmente encuentra que la entrada en el AP mapa más cercano (como en "antes o igual") a la dirección IP actual (puntero de instrucciones) y pone de relieve esa línea.

A veces el juego no es muy buena, y es entonces cuando se ve el área resaltada saltando por todo el lugar.

El depurador hace una suposición de mejor esfuerzo en donde se produjo el problema. No se garantiza que sea fiable al 100%, y con código completamente optimizado, a menudo será inexacta -. He encontrado las inexactitudes que van desde unas pocas líneas fuera a tener una pila de llamadas del todo mal

¿Qué tan exacto es el depurador con código optimizado realmente depende del código en sí mismo, y que optimizaciones que está haciendo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top