visual studio significado instalar espaƱol caracteristicas compiler-construction dynamic debugging cil dynamic-language-runtime

compiler-construction - significado - instalar clr visual studio 2017



Haciendo un lenguaje CLR/.NET debuggable (1)

Para hacer que se pueda depurar IL, debe compilar el código en un ensamblaje que se pueda depurar. También hay un inconveniente inmediato en que el ensamblaje no será coleccionable por GC. Para hacer esto, haga AppDomain.CurrentDomain.DefineDynamicAssembly , luego llame a DefineDynamicModule y defina un módulo en el ensamblaje. Para hacerlo debugable necesita establecer algunos atributos en él:

DebuggableAttribute.DebuggingModes attrs = DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.DisableOptimizations; Type[] argTypes = new Type[] { typeof(DebuggableAttribute.DebuggingModes) }; Object[] argValues = new Object[] { attrs }; _myAssembly.SetCustomAttribute(new CustomAttributeBuilder( typeof(DebuggableAttribute).GetConstructor(argTypes), argValues) ); _myModule.SetCustomAttribute(new CustomAttributeBuilder( typeof(DebuggableAttribute).GetConstructor(argTypes), argValues) );

Finalmente, mientras emite la IL, llame a MarkSequencePoint para marcar las líneas de las siguientes instrucciones de IL.

Hacer que los sitios de llamadas DLR puedan ser depurados me parece extraño: en general, su sitio de llamadas no contendrá ningún código de usuario. Más bien contendrá código para realizar una operación y no hay ningún código fuente asociado con ese código. Pero supongamos que realmente desea tener algo para pasar que esté asociado con los árboles de expresión que está generando para un sitio de llamadas. Para hacer eso tendrás que hacer dos cosas. Primero, almacene la información de depuración en el árbol de expresiones; haga esto usando DebugInfoExpression . Lo siguiente es compilar el método en un método de depuración y proporcionar ese delegado al DLR.

Para compilar el método necesita usar LambdaExpression<T>.CompileToMethod . El MethodBuilder que deberá proporcionar deberá ser un método estático definido en un tipo en el ensamblaje de depuración que creó anteriormente.

Para proporcionar ese delegado al DLR tiene dos opciones. Probablemente, lo más fácil sería devolver una expresión que invoque al delegado debuggable compilado (solo aferrándose a ella a través de la constante). La forma más difícil, pero en cierto modo más elegante, sería anular BindDelegate<T> en el sitio de la llamada y devolver al delegado compilado. Eso comienza a crear los argumentos de Expression apropiados y llamar a los métodos Bind* para producir el árbol de expresiones de tu yo.

Todo esto se realiza en la capa externa DLR / IronPython / IronRuby, todo disponible en ironpython.codeplex.com . Puede ver CompilerHelpers.CompileToMethod como un ejemplo de cómo hacer la compilación, la clase Snippets (y las clases AssemblyGen / TypeGen / ILGen para crear los ensamblajes debuggable e incluso el compilador del árbol de expresiones DLR (en Runtime/Microsoft.Scripting.Core/Compiler ) para un ejemplo de emitir la información de línea.

¿Cuáles son algunos recursos para hacer que un lenguaje CLR / .NET pueda ser depurado? Estoy desarrollando un compilador de ActionScript 3 a IL, que utiliza DLR CallSites y CallSiteBinders para manejar los aspectos dinámicos del lenguaje de programación estático. Estoy buscando información sobre cómo hacer que el IL emitido se vuelva a asignar al código fuente, y también me gustaría saber cómo puedo hacer que los sitios de llamadas dinámicas también se vuelvan a asignar.

Así que esto es, en última instancia, dos preguntas:

  • ¿Cómo puedo hacer que el IL se pueda depurar?
  • ¿Cómo puedo hacer que los sitios de llamadas DLR se puedan depurar?

Cualquier ayuda sería muy apreciada!

Lo que busco en términos de "debuggabilty"

Dentro de la instancia de Visual Studio adjunta:

  • Paso a través del código
  • Ver locales
  • Ver traza de pila