2010-07-08 6 views
6

Primero el problema que estoy tratando de resolver: estoy depurando una aplicación C# que tiene enormes gráficos de objetos (piense en Modelos de información de construcción, una especie de CAD orientado a objetos). Cuando llego a un punto de interrupción, generalmente tengo listas largas de objetos que primero necesito transformar para que sean útiles para la depuración.¿Cómo extender el depurador de Visual Studio con un shell IronPython?

En el código, uso LINQ y lambdas para hacer esto. Pero no puede hacer eso en la ventana Inspección y la ventana Inmediato.

¿Cómo podría agregar una extensión de shell IronPython a Visual Studio 2010 que me permite buscar la misma información disponible en la ventana Inmediato/Ventana de observación?

EDIT: Puedo averiguar cómo hacer un visualizador de depurador. Pero de la API parece que solo tendría acceso al objeto que se visualiza, mientras que en realidad preferiría tener acceso a todas las variables locales.

EDIT: De the documentation on msdn parece que un DE (Debug Engine) con un EE (Expression Evaluator?) Puede hacer el truco. Esto es para integrar tu propio lenguaje en Visual Studio. Estoy tratando de enganchar en el DE existente o al menos proporcionar mi propio EE.

Respuesta

1

No sé si esto va a ayudar, pero hay una buena serie de escribir depuradores y extensiones de código administrado en:

http://devhawk.net/blog/2009/2/27/writing-an-ironpython-debugger-mdbg-101

antes de empezar a escribir ningún código depurador, pensé ayudaría a revisar rápidamente la infraestructura del depurador .NET que está disponible como y el diseño del depurador de línea de comandos MDbg. Tenga en cuenta que mi comprensión de de este material es bastante rudimentaria: Mike Stall es "da hombre" si está buscando un blogger depurador de .NET para leer.

El CLR proporciona una serie de APIs no administrados para cosas como alojamiento el CLR, leer y escribir metadatos CLR y - más relevante para nuestra discusión actual - depuración, así como la lectura y la escritura depurador símbolos. Estas API están expuestas como objetos COM. La API de depuración de CLR le permite hacer todas las cosas que cabría esperar hacer en un depurador: adjuntar a procesos (en realidad, dominios de aplicación), crear puntos de interrupción, paso a paso, etc. Por supuesto, una API no administrada, , no está disponible para ser utilizada desde IronPython. Afortunadamente, MDbg envuelve esta API no administrada para nosotros, haciéndola disponible para cualquier lenguaje administrado , incluido IronPython.

El diseño básico de MDBG se parece a esto:

imagen

En la parte inferior es la asamblea “en bruto”, que contiene la definición de C# de la API depurador no administrado - básicamente cualquier cosa que empieza con ICorDebug e ICorPublish. Raw también define algunos de los API de metadatos, , ya que así es como se expone la información del tipo al depurador.

El siguiente nivel es el ensamblado "corapi", al que me refiero como la API de depurador administrado de bajo nivel . Esta es una capa bastante delgada que traduce el paradigma no gestionado en algo más aceptable para los desarrolladores de código administrado . Por ejemplo, los enumeradores COM como ICorDebugAppDomainEnum están expuestos como tipos de IEnumerable. Además, la interfaz de devolución de llamada administrada se expone como eventos .NET. No es perfecto - el código está escrito en el estilo C# 1.0 por lo que no hay genéricos o rendimientos.

Donde corapi es la API de bajo nivel, "mdbgeng" es la API de depurador administrada de alto nivel . Como era de esperar, ajusta la API de bajo nivel y proporciona implementaciones automáticas de operaciones comunes. Por ejemplo, esta capa mantiene una lista de puntos de interrupción para que pueda crearlos antes de que se haya cargado el ensamblaje pertinente. Luego, cuando los ensamblados están cargados en , pasan por la lista de puntos de interrupción independientes para ver si se puede enlazar . También es esta capa la que crea automáticamente el punto de entrada principal del punto de entrada .

Finalmente, en la parte superior tenemos la aplicación MDbg misma, así como cualquier extensión MDbg (representada por ... en el diagrama de arriba). El ensamblado mdbgext define los tipos compartidos entre MDbg.exe y los ensamblados de extensión . MDbg tiene algunas extensiones geniales, incluida una extensión de IronPython , pero por ahora estoy centrado en construir algo tan ligero como sea posible, así que voy a renunciar a un mecanismo de extensibilidad , al menos por ahora.

Mi prototipo inicial se escribió en contra de la API de alto nivel. Hay fueron dos problemas con este enfoque. La primera es que no hay compatibilidad con para Just My Code en la API de alto nivel. Como mencioné en mi última publicación de , el soporte de JMC es fundamental para este proyecto. Agregar el soporte de JMC no es difícil, pero estoy tratando de hacer los menos cambios posibles al origen de MDbg, ya que no estoy interesado en bifurcar y manteniendo ese código. En segundo lugar, mientras que la API de bajo nivel proporciona una API basada en eventos (OnModuleLoad, OnBreakpoint, OnStepComplete, etc.), la API de alto nivel proporciona una API de bucle más orientada a la consola. Encontré la API controlada por eventos para que sea más limpia para trabajar y creo que funcionará mejor si alguna vez construyo una versión de GUI de ipydbg. Así que he decidido a trabajar contra la API de bajo nivel (también conocido como corapi).

He mencionado anteriormente que no quería cambiar la fuente MDbg, pero I hizo un pequeño cambio. La separación de corapi y raw en dos conjuntos separados es un artefacto obsoleto de una versión anterior de MDbg. Así que decidí combinar estos dos en un solo ensamble llamado CorDebug. Además de algunos simples atributos de limpieza a nivel de ensamblaje para hacer posible un solo ensamblaje, no he cambiado el código fuente en absoluto.

+0

Gracias. Había visto MDbg, pero no pude compilar la extensión de python). Esto parece una especie de root, porque es un depurador independiente y me gustaría conectarme al Visual Studio Debugger. Por desgracia, creo que voy a perder este :( –

4

Resulta bastante fácil escribir un complemento de Visual Studio 2010: simplemente descargue e instale el SDK de Visual Studio 2010. A continuación, crea un proyecto Addin.

El método OnConnection en la clase Connect de su complemento le proporcionará una instancia DTE2. Esto puede ser usado para hurgar en el estudio depuradores Evaluador de Expresión Visual:

DTE2 application; // fill this in OnConnection 
application.Debugger.GetExpression("some c# code goes here") 

Los resultados son Expression casos, los objetos COM. Compruebe la propiedad Value.

Tarea: Averigua cómo envolverla en un bonito marco pitónico para que parezca perfecta.

+0

Cualquier persona interesada en cómo va esto: simplemente comente aquí, con mucho gusto publicaré el código en el host del proyecto a cambio de alguna ayuda. –

+0

Acabo de preguntar sobre algo similar aquí http://stackoverflow.com/questions/4749974/getting-debugger-context-in-f-interactive y luego encontré esta pregunta. Estoy interesado en cómo van las cosas con su implementación. – Max

+0

@Max , Perdí interés;) puede encontrar el código en: http://code.google.com/p/ironpythondebugger/ –

Cuestiones relacionadas