Depurar el RTC (I)
Vamos a ver cómo podemos depurar nuestras páginas y demás objetos para el RTC paso a paso utilizando Visual Studio.
Este es el primero de los artículos sobre depuración en el RTC que publicaremos en el blog, y en el que crearemos una página muy sencilla y depuraremos su código durante la ejecución, para que podamos aprender las conceptos y pasos básicos para luego poder depurar objetos más complejos. Los pasos serán los siguientes:
Crear la página
Activar la depuración
Depurar
Información útil a la hora de depurar
Para el ejemplo aquí explicado utilizaremos:
- Microsoft Dynamics NAV 2009 R2.
- Microsoft Visual Studio 2010 Professional.
Crear la página
Creamos una página vacía (para el ejemplo será 50001 PruebaRTCDebug) con una nueva acción a la que llamaremos “Mensajes”. En el código de la acción, creamos dos variables locales:
Name | DataType | Subtype | Length |
n | Integer | ||
str | Text | 30 |
y escribimos las siguientes líneas en “Mensajes - OnAction()”:
n := 21; MESSAGE('%1', n); str := '¡hola mundo!'; MESSAGE('%1', str); |
Por comodidad podemos cambiar algunas de la propiedades de la acción, como por ejemplo:
Promoted=Yes; PromotedIsBig=Yes; Image=Start; |
Guardar y compilar.
Activar la depuración
Para ello vamos al CustomSettings.config del servicio (“%PROGRAMFILES(X86)%\Microsoft Dynamics NAV\60\Service\CustomSettings.config” en x64, o “%PROGRAMFILES%\Microsoft Dynamics NAV\60\Service\CustomSettings.config” en x86) y ponemos a “true” lo siguiente:
<add key="EnableDebugging" value="true" />
Al reiniciar el servicio de NAV (por defecto “MicrosoftDynamicsNavServer”) y abrir el RTC veremos que en “%PROGRAMDATA%\Microsoft\Microsoft Dynamics NAV\60\Server\MicrosoftDynamicsNavServer\source” nos ha generado un .cs por cada objeto que tengamos para el RTC:
Cuando no necesitemos depurar debemos recordar poner de nuevo el valor de "EnableDebugging" a “false” y reiniciar el servicio de NAV, ya que cuando tenemos el Debugging activado nos estará generando por detrás todos los archivos C# y el RTC tardará más en arrancar.
Depurar
Abrimos Visual Studio (click derecho y “Run as Administrator”). Lo primero es abrir el código fuente de la página, así pues vamos a “File –> Open –> File” (Ctrl + O) y de entre los archivos .cs generados abrimos la página que creamos antes (50001 PruebaRTCDebug):
Ahora podremos ver el código en C/AL (comentado) con el equivalente en C# para cada línea:
En este caso hemos puesto un breakpoint en la línea que equivale a “n := 21;” haciendo doble click en el margen izquierdo o mediante “Debug –> Toggle Breakpoint”.
El siguiente paso es ir a “Tools –> Attach to Process (Ctrl + Alt + P)”. En la lista de procesos seleccionamos el del servicio de NAV y le damos a “Attach”:
Ahora si ejecutamos la página que creamos en el RTC, y le damos a la acción “Mensajes”:
Veremos que en Visual Studio la ejecución se para justo en nuestro breakpoint:
y podremos seguir avanzando en la ejecución mediante F10 (Step Over) y F11 (Step Into):
Hasta aquí lo principal. Según nuestras necesidades también tenemos que tener en cuenta las opciones e indicaciones del siguiente apartado.
Información útil a la hora de depurar
Si realizamos un cambio en la página desde NAV
En este caso tras guardar y compilar la página en el cliente clásico y al ejecutarla de nuevo, en Visual Studio se nos mostrará un diálogo indicando que el código fuente ha sido modificado y si queremos actualizarlo:
Tras aceptar esto, nos aparecerá el código actualizado con los cambios que realizamos en la página.
Variables
Podemos analizar el comportamiento de las variables durante la ejecución ya sea situando el cursor sobre la variable que nos interese en cada momento:
o añadiendo las variables que quedamos monitorizar a un “Watch” (doble click sobre la variable y arrastramos hasta el “Watch”):
También podremos monitorizar las variables locales en la pestaña “Locals”
En este caso como podemos ver para nuestro “str” de tipo “Text“ en C/AL nos crea un objeto de la clase “NavText“ en C#. Para estos casos en los que nuestras variables son objetos podremos ver también valores para atributos de la clase como “MaxLengh”, que lo habíamos dejado por defecto en 30.
Breakpoints
En el panel de breakpoints podemos ver todos los breakpoints que hayamos definido (para este y otros .cs de objetos):
En algunos casos nos puede interesar que se detenga en un breakpoint sólo si se cumple cierta condición. Para crear un breakpoint condicional podemos hacer click derecho sobre el breakpoint y hacer click en “Condition…” y se nos mostrará una ventana donde podemos definir dicha condición:
En este caso le indicamos que sólo pare cuando “n” sea distinto de “2” (lo cual obviamente siempre se cumple por lo que siempre se parará, pero sirve de ejemplo). Los condicionales nos aparecen en el panel de breakpoints marcados con una cruz blanca y con la condición que hemos definido.
Llamadas
En el panel de Call Stack (“Debug –> Windows –> Call Stack") podemos ver las llamadas hasta el breakpoint o línea en la que estemos parados. Por ejemplo, si modificamos el código de la página anterior para que desde “OnAction” se llamara a una función “Funcion1” y desde esta misma se llamara a “Funcion2”, si ponemos un breakpoint en “Funcion2” tendremos el sigueinte Call Stack:
Registros, memoria y desensamblador
Si por cualquier razón necesitáramos analizar más a bajo nivel lo que está ocurriendo durante la ejecución de nuestro código, podemos también ver el estado de los registros en cada momento (Debug –> Windows –> Registers), donde en rojo nos destaca aquellos cuyo valor ha cambiado en la última línea ejecutada:
o buscar el valor que haya cargado en memoria para una determinada dirección (Debug –> Windows –> Memory).
También podremos ver el código ensamblador asociado (Debug –> Windows –> Disassembly) y depurar desde aquí instrucción a instrucción:
Juliet R. Moreiro Bockhop
Microsoft Dynamics NAV Support Engineer
“Los ejemplos aquí expuestos se proporcionan sólo como ejemplo ilustrativo y en ningún caso el autor se hace responsable del contenido ni efectos que pueda tener su uso.”