¿Qué ocurre si añadimos líneas de código IL y añadir puntos de interrupción en nuestro programa?

StackOverflow https://stackoverflow.com/questions/1247596

Pregunta

Si añado digamos 1 línea a la beggining de un método, si me puse un punto de ruptura a través de Visual Studio en la primera línea, habrá que apuntar a la primera línea o el segundo? Si se marcará la línea equivocada, ¿hay algo que podríamos hacer al editar archivos .exe para asegurar una sesión de depuración normal después?

¿No hay algo así como el establecimiento de la línea X a ser Y? Recuerdo haber visto algo así en algún lugar, no estoy seguro si .NET relacionado o no.

¿Fue útil?

Solución

Usted necesita actualizar los símbolos de depuración en el archivo PDB si desea que la experiencia de depuración de permanecer sin cambios.

La mejor opción para esto que he visto es utilizar Mono.Cecil , como que soporta la modificación de los símbolos de depuración (limitado), así como la IL.

Otros consejos

Si está modificando IL continuación, los archivos PDB contendrán información obsoleta. Tenga en cuenta que probablemente no habrá un 1:. 1 entre los cambios en las líneas de IL a las C # line # s (por ejemplo, la inserción de 3 estados IL no compensará el punto de interrupción IDE por 3 líneas de C #)

Es posible que desee separar las porciones modificado IL-de su código en métodos separados para minimizar el impacto. Además, suponiendo que es el que hace la modificación IL, puede que le resulte conveniente para cambiar entre las vistas de C # y IL durante la depuración.

Es posible que necesite un poco lodo con el código generado para facilitar eso. Por ejemplo, si la IL inyectado puede estar en un método de envoltura entonces se podría decir que el depurador de ignorarlo por el uso de attrbiutes tales como DebuggerStepThroughAttribute, DebuggerNonUserCodeAttribute, o DebuggerHiddenAttribute. (Busque la documentación de los matices en el comportamiento)

espero que se marcan como archivos .pdb podría no coincidir.

¿Cómo estás añadiendo la IL? Si usted está haciendo esto a través de la instrumentación de perfiles (SetILFunctionBody), entonces es necesario proporcionar un nuevo mapa de código IL también (SetILInstrumentationCodeMap) para que el depurador se da cuenta de la modificación IL.

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