HOWTO: Depurar desde Visual Studio código X++ que se ejecuta en el servidor AX 2012

Gran parte del código X++ que desarrollamos en clases se ejecuta en la capa del servidor (Data Providers en informes, procesos Batch, SysOperation, …), lo que resulta un poco incómodo a la hora de depurar. Si ponemos un breakpoint desde el editor de X++ en MorphX en código que se ejecuta en el servidor, veremos como el depurador integrado nunca se detiene en este punto.

Preparar el entorno de desarrollo para poder depurar código del servidor desde Visual Studio (incluso el código X++, que en el servidor siempre se ejecuta como código CIL) nos obliga a tener en cuenta unos cuantos pre-requisitos, así que los voy a enumerar aquí para tenerlos a mano cuando nos hagan falta:

Pre-requisitos y consideraciones previas:

  • Asegurarse de que el código CIL se ha ejecutado completamente y sin errores. De otra forma, el ensamblado que queremos depurar puede no estar disponible en su última versión, sino en la última que se compiló sin errores.
  • Para depurar código remoto, ejecutar Visual Studio siempre como Administrador (con permisos elevados, haciendo click-derecho > Ejecutar como administrador). Si no, más adelante tendremos problemas de permisos.
  • La depuración remota desde Visual Studio debe hacerse en el mismo servidor donde está instalado el AOS, lo que nos obliga indirectamente a utilizar un entorno de desarrollo, ya que esta no es la configuración ideal para un AOS en producción.
  • En la configuración del AOS debe estar activada la opción Enable breakpoints to debug X++ code runing on this server (esto tampoco es nada recomendable en un AOS en producción).
  • Asociar un proceso al AOS para depurar pone el servidor en un estado extremadamente inestable, con un riesgo muy importante de que el servicio se reinicie inesperadamente. Por tanto es muy recomendable utilizar un servidor de desarrollo aislado para no molestar al resto de desarrolladores. Si utilizamos un sólo AOS para todos los desarrolladores, puede ser interesante tener otro AOS para la depuración remota.

Iniciar la depuración remota:

  • Iniciar Visual Studio en el servidor y con permisos elevados.
  • Si no se está mostrando ya, mostrar el Application Explorer (desde el menú Ver), lo que nos muestra el AOS en VS.

  • Navegar en el Application Explorer y poner los breakpoints donde deseemos detener la ejecución (añadir los breakpoins en Visual Studio, no en MorphX!!).
  • Si en la barra de estado de Visual Studio (en la parte inferior de la ventana) aparece el mensaje “Cargando símbolos”, es mejor esperar a que este proceso termine. La primera vez es un proceso lento; Las siguientes veces se ejecutará mucho más rápido.

cargando-simbolos

  • Ir al menú Depurar > Asociar al proceso
  • Activar el checkbox Mostrar los procesos de todos los usuarios y Mostrar los procesos de todas las sesiones, seleccionar el proceso Ax32Serv.exe del AOS que queremos depurar y pulsar Asociar.

Visual Studio - Asociar al proceso

  • Después de este proceso puede que se vuelvan a cargar símbolos (se descarga el código X++ y los ensamblados CIL del AOS a la sesión de Visual Studio). Todo el código se descarga en C:\Program Files\Microsoft Dynamics AX\60\Server\<NOMBRE DEL AOS>\bin\XppIL\source para que Visual Studio tenga acceso a el y nos lo muestre en el editor.
  • Cuando se hayan descargado todos los objetos, ya podemos ejecutar nuestra aplicación y al llegar al breakpoint, éste se detendrá en la sesión abierta de Visual Studio (no en el depurador de MorphX).
  • Si lo que estamos intentando depurar se invoca desde una aplicación externa, como por ejemplo un servicio web, podemos tener otra instancia de Visual Studio abierta para ejecutarla. En este caso debe ser una instancia diferente del Visual Studio que utilizamos para depurar que está asociada al AOS.
  • Si hemos dejado que se descarguen todos los símbolos, podremos navegar por la ejecución de manera habitual, aunque a veces el código de algunos objetos no estará disponible durante la depuración. En este caso podemos detener la depuración y abrir el objeto en el Application Explorer, para estar seguros de que Visual Studio lo ha descargado.

Más información: