Artículo
· 18 mayo, 2023 Lectura de 4 min

Cómo depurar código en IRIS

En este breve artículo me gustaría compartir un par de estrategias para ejecutar el código Objectscript en modo depuración.

Cómo entrar en el modo depuración

Hay dos formas de lanzar el depurador.

Lanzando un comando

Supongamos que tenemos que depurar el siguiente método:

Class Custom.Example Extends %RegisteredObject
{

/// check if a string can be a valid STP code ("STP" + 13 digits)
/// w ##class(Custom.Example).isValidSTPCode("STP1234567891011")
ClassMethod isValidSTPCode(code As %String) As %Boolean
{
	set STPPrefixCode= "STP"
	if ($extract(code,1,$length(STPPrefixCode)) = STPPrefixCode) {
		set tmpDX=$piece(code,STPPrefixCode,2)
		return ($zstrip(tmpDX,"*N") = "") && ($length(tmpDX) = 13)
	}
	return 0
}

}
  1. pon el cursor en la primera línea de tu método
  2. menu Debug -> Enable/Disable breakpoint (F9)
  3. menu Debug -> Debug destination -> ObjectScript method -> input a plain command (no do/write before):  ##class(Custom.Example).isValidSTPCode("STP123")
  4. Debug -> Go

El motor de depuración entrará en tu método y parará la ejecución donde fijaste el punto de parada.

 

Adjuntar a un proceso

Hay casos en los que el método que quieres depurar es llamado por algún procedimiento externo (por ejemplo, un procedimiento almacenado llamado por un cliente JDBC) y no sabes qué tipo de datos de entrada recibe. O podría ser el caso de que tu método depende de datos definidos en el contexto del proceso (por ejemplo en la variable %request). Para evitar replicar el contexto en el que se ejecuta el método en la ejecución actual, puedes adjuntar Studio al proceso actual que lo está ejecutando.

Si tu trabajo se está ejecutando como un business process/service etc.. en una producción, puedes recuperar el id del trabajo desde el portal de IRIS, seleccionando la pestaña Job de tu elemento de producción.

Sin embargo, si no sabes esta información, puedes usar el siguiente enfoque: 

  1. Añadir el siguiente fragmento en tu método, donde normalmente pondrías el punto de parada
    set ^zDebug("job") = $job
    while $get(^zDebug) && $get(^zDebug("job")) {
        hang 0.5
    }
     
  2. En el terminal, lanzar set ^zDebug=1
  3. Activar la ejecución de tu código (llamando al procedimiento almacenado desde el cliente, o lanzando una acción del usuario en tu aplicación web...) 
  4. Tu procedimiento entrará en el bucle infinito, en el terminal lanza w ^zDebug("job") y copia el resultado
  5. Menú Debug -> Attach -> Introduce el id del proceso -> OK (usando el teclado: CTRL+SHIFT+A --> TAB --> CTRL+V)
  6. Entrarás en el modo depuración en una de las líneas del fragmento definido arriba. En el terminal, lanza k ^zDebug("job")
  7. Depura como siempre

 

Cómo depurar

Una vez que estás en el modo depuración, puedes usar los botones de depuración habituales: "Execute instruction" para ejecutar una línea de código, "Enter/exit instruction" para entrar o salir del método actualmente en ejecución, "Execute to the cursor" para ejecutar hasta la línea que seleccionas en el editor.

Otra funcionalidad especialmente útil del depurador es que puedes inspeccionar todas las variables en el contexto, e incluso lanzar comandos que tomarán esas variables como entrada, ya sea estableciendo "controll expressions" o lanzando comandos en la consola. Me parece muy útil hacer zw myObject y zw myArraypara obtener el contenido completo de las variables estructuradas.

Ten en cuenta que al lanzar comandos de configuración, puedes incluso cambiar tus variables y ver cómo se comporta el código siguiente, por ejemplo forzándolo a entrar en una rama del "if" que de otra manera sería muy difícil de replicar.

Por último, en el panel de control, puedes inspeccionar toda la pila que llevó a la llamada de tu método. Al hacer clic en cada línea de la pila, Studio intentará llevarte a la clase actual (si la clase está en modo despliegue, obtendrás un error, es normal, solo haz clic en ok). A la derecha mostrará en una lista todas las variables disponibles en el contexto del método que seleccionaste.

 

Una última cosa para recordar

Estas son solo algunas formas de depurar código. En mi ejemplos uso Studio, pero el enfoque puede replicarse de forma muy similar en VS code, y si estás dispuesto a aprender los comandos, incluso por terminal.

Studio puede tener algunos problemas al depurar, por ejemplo, puede resaltar una línea de código que no es la que se está ejecutando realmente. Esto ocurre especialmente con SQL embebido, siempre puedes cambiar a la representación interna del código (CTRL+SHIFT+V), que será más fiable.

La razón por la que se añade $get(^zDebug) es que puedes salir del modo depuración sin tener que recompilar la clase. Por supuesto, puedes renombrar el global a lo que sea más conveniente para ti.

Si estás trabajando en un entorno compartido, ten en cuenta que todos los que ejecuten tu código se quedarán atascados en un bucle infinito. Puedes considerar añadir otras condiciones al "while", por ejemplo, si tienes una sesión podrías añadir esto al principio if %session.SessionId = "xxxxxxxx" o limitarlo a las entradas específicas en las que estás trabajando.

Comentarios (0)1
Inicie sesión o regístrese para continuar