New post

Encontrar

Article
· Dec 19, 2025 6m read

Depuração 101: Seu Primeiro Breakpoint e Acompanhamento de Variáveis no VS Code

Neste artigo, vamos discutir todas as ferramentas de depuração incluídas no Microsoft Visual Studio Code.

O que será abordado:

  • Breakpoints  
  • Janela de observação (Watch window)  
  • Call Stack  

Vamos começar aprendendo sobre os requisitos para depuração!

Pré-requisitos

Existem dois plugins (extensões) para depuração de ObjectScript:

O primeiro faz parte do InterSystems ObjectScript Extension Pack. O segundo é Serenji, um plugin independente que fornece um editor, gerenciador de arquivos e funcionalidades de depuração. Ambos os plugins podem ser instalados a partir da loja de plugins. Para ativar funcionalidades principais, o Serenji requer uma licença. Para este artigo, usaremos o InterSystems ObjectScript Extension Pack para reduzir a curva de aprendizado. Depois de dominar o básico, você pode considerar a compra de uma licença paga para o Serenji.
 

Você ira precisar: 

  1. A versão mais recente do Microsoft Visual Studio Code 
  2. Plugin InterSystems ObjectScript Extension Pack (após instalar o Visual Studio Code)
  3. Instância do InterSystems IRIS. Você pode escolher entre a versão Docker ou o kit de instalação. (é necessário estar registrado no Developer Community)

Para saber como conectar seu IRIS ao IDE Microsoft Visual Studio Code, você pode ler aqui.

 

Configurando a função de depuração


Normalmente, o arquivo de configuração é gerado automaticamente após o início da depuração. Ele terá a seguinte aparência:

 

{
    "configurations": [
       
    {
        "type": "objectscript",
        "request": "launch",
        "name": "ObjectScript Run current routine",
        "program": "${file}"
    }
    ]
 
}

 

Onde type é a linguagem do código que está sendo depurado, request é a opção de início da depuração (launch – inicia e executa o código ou attach – conecta ao código que já está em execução), name é o identificador da depuração, e program é o nome da classe e do método que estão sendo depurados (nesta configuração, um arquivo aberto é selecionado).

Breakpoint

            Qualquer código de programa é executado de cima para baixo, linha por linha. Ao depurar, é importante entender o estado do programa em qualquer momento, incluindo os valores das variáveis locais e globais, a abertura e fechamento de arquivos, conexões web, entre outros.

            Breakpoint é uma ferramenta de depuração que permite pausar a execução do programa em uma linha específica para identificar mudanças indesejadas no estado do programa. Começar a depurar no Visual Studio Code é muito simples. Suponha que tenhamos o seguinte código:

 

Class Test.MyFile Extends %RegisteredObject
{

ClassMethod TestVar() As %Integer
{
    set randomNum = $RANDOM(10)
    return randomNum
}

ClassMethod MyMethod() As %Integer
{
    set randomNum = ..TestVar()
    set numVar = 2
    set numDivision = randomNum / numVar

    return numDivision
}
}

Precisamos entender o valor armazenado na variável x no método MyMethod(). Esse valor é retornado pelo método TestVar(). Definimos um breakpoint antes de realizar a operação aritmética com essa variável na linha 15 e clicamos no botão Debug. Se você não definir um breakpoint, a depuração simplesmente executará o código sem exibir nada no console.

Podemos ver o valor de uma determinada variável imediatamente após iniciar a depuração! Muito conveniente. Em seguida, podemos percorrer todo o programa linha por linha pressionando o botão Step into ou F11.

 

Ótimo! Agora sabemos os valores das variáveis em cada passo da execução do código.

Podemos percorrer as variáveis dentro de um loop da mesma maneira. Vamos considerar o seguinte código:

 

Class Test.MyFile Extends %RegisteredObject
{

ClassMethod LoopMethod() As %List
{

    set objList = $LB("string", 1, {"name":1})
    for i=1:1:$LL(objList){
        set item = $LG(objList, i)
    }
    
    return objList
}

}

Vamos definir um breakpoint no início do método e iniciar a depuração. Em seguida, usando o botão “Step into” no painel de depuração localizado na parte superior do IDE, avançamos no programa e observamos os valores atribuídos à variável item. Também podemos ver os valores de todas as outras variáveis do programa, incluindo a variável iteradora i, que neste caso é igual a 2.


 Assim, avançando pelo loop, você pode acompanhar qual valor será atribuído à variável item em cada passo do loop.

Janela de observação (Watch window)

Também podemos monitorar o estado de uma variável durante a depuração adicionando-a à janela de observação. No modo de observação, podemos aplicar métodos a uma variável e acompanhar seu estado em cada iteração. Por exemplo, considere o seguinte código:

Class Test.MyFile Extends %RegisteredObject
{

ClassMethod WatchAVariable() As %List
{
    set list = ""
    set randomNum = $RANDOM(100)
    for int=randomNum:randomNum:100000{
        set list = list _$LB(int)
    }

    return list
}
}

E vamos escrever três métodos para a variável list:

 
Queremos acompanhar o comprimento da lista $LL(list), o último número adicionado $LG(list, -1) e sua raiz quadrada $LG(list, -1) ** 0.5. Entramos no loop e obtemos os primeiros valores:

 Ao definir funções na janela de observação, podemos ver informações detalhadas da depuração! Além disso, a janela de variáveis continua exibindo os valores das variáveis iteradoras int e o passo do loop. Muito conveniente!

Janela da pilha de chamadas (Call Stack)

Observe a janela “Call Stack” na parte inferior. Essa janela mostra a ordem das chamadas de função no seu código. No nosso estado atual, temos dois itens: o loop e a atribuição das variáveis WatchVariable+7 e WatchVariable+6, respectivamente. Mas tudo aqui é bastante autoexplicativo. Vamos adicionar um pouco mais de lógica:

Class Test.MyFile Extends %RegisteredObject
{

ClassMethod RandomlyChangeVar() As %Integer
{
    return $RANDOM(100)
}

ClassMethod WatchAVariable() As %List
{

    set list = ""
    set randomNum = $RANDOM(100)
    for int=randomNum:randomNum:100000{
        set list = list _$LB(int)
        if $LG(list, -1) ** 0.5 > 10{
            set int = int + ..RandomlyChangeVar()
        }
    }
    return list
}


}  


Adicionamos um novo método, RandomlyChangeVar(), que irá alterar a próxima variável int se a raiz quadrada do último número for maior que 10. Continuamos o loop até que o estado das variáveis satisfaça a condição lógica:

 

Observe os valores da função de raiz quadrada e a ordem das chamadas de função na pilha de chamadas. Assim que a raiz quadrada ultrapassou 10, a função RandomlyChangeVar() foi chamada imediatamente! Além disso, ao medir o comprimento da lista, conseguimos acompanhar quantos passos do loop foram necessários para atingir a condição lógica desejada. Isso facilita rastrear a ordem e as condições de chamadas de múltiplas funções, não importa quão complexa seja a lógica.

É isso! Agora você domina a depuração de ObjectScript no VSCode.


Neste artigo, analisamos detalhadamente o recurso de depuração no VSCode. Definimos nosso primeiro breakpoint e acompanhamos os valores das variáveis.

Artigo Original: https://community.intersystems.com/post/debugging-101-your-first-breakpo...

1 Comment
Discussion (1)1
Log in or sign up to continue
Announcement
· Dec 19, 2025

[Video] Using InterSystems Data Studio with Supply Chain Module as a Data Gateway

Hey Community!

We're happy to share a new video from our InterSystems Developers YouTube:

⏯  Using InterSystems Data Studio with Supply Chain Module as a Data Gateway @ Ready 2025

The presentation shows how InterSystems Data Fabric Studio with the Supply Chain Module acts as a data gateway, integrating and unifying data from multiple ERP systems. Users can stage, transform, validate, reconcile, and promote data to internal or external systems, create snapshots for auditing, and schedule tasks for automation. All without coding, ensuring consistent and reliable supply chain data.

🗣 Presenter: Emily Cohen, Senior Solutions Developer, InterSystems

Enjoy watching, and subscribe for more videos! 👍

Discussion (0)1
Log in or sign up to continue
Question
· Dec 19, 2025

OpenTelemetry - how to emit custom structured log messages?

I am experimenting with OpenTelemetry and recently connected all IRIS instances to telemetry servers.
I'm not interested in emitting custom metrics since IRIS does it fine, regarding tracing - we can use %Trace classes to emit custom traces, but what about logging?

I see that IRIS is able to send system log messages to the OpenTelemetry servers:

Discussion (0)1
Log in or sign up to continue
Announcement
· Dec 19, 2025

Anunciando los Premios del 10.º Aniversario de la Comunidad de Desarrolladores

Como parte de nuestra celebración de 10 años, nos complace reconocer a ciertos miembros cuyas contribuciones a largo plazo han dado forma de manera significativa a la Comunidad de Desarrolladores de InterSystems.

Durante la última década, estas personas han compartido conocimiento, apoyado a sus compañeros y contribuido a fortalecer el espíritu de colaboración que define nuestra Comunidad.

Para honrar su impacto, estamos presentando un conjunto especial de premios de la Edición del 10.º Aniversario y medallas de Global Masters:

Medalla Galardonados
 
Nominación: Maestro del Conocimiento — Edición del 10.º Aniversario

@Robert Cemper
@Eduard Lebedyuk 
@Muhammad Waseem
@Luis Angel Pérez Ramos 
@姚 鑫

@Scott Roth 
@Yuri Marx 
@Yone Moreno 
@Mihoko Iijima 

@Rochdi Badis 

@Megumi Kakechi 
@John Murray
@Dmitry Maslennikov
@Hiroshi Sato 
@Evgeny Shvarov 

 
Nominación: Mejor Mentor — Edición del 10.º Aniversario

@Robert Cemper 
@Vitaliy Serdtsev 

@Eduard Lebedyuk 
@Jeffrey Drumm 
@Julius Kavay 

@Dmitry Maslennikov 

@Timothy Leavitt 
@John Murray 
@Luis Angel Pérez Ramos
@Alexander Koblov  
@Enrico Parisi 
@Vic Sun  

@Evgeny Shvarov  
@Julian Matthews  
@Guillaume Rongier 
@Marc Mundt  
@Ben Spead 
@Alexey Maslov 

 
Nominación: Voz Global — Edición del 10.º Aniversario

Comunidad de Desarrolladores en español:

@Luis Angel Pérez Ramos 
@Ricardo Paiva 
@Jose-Tomas Salvador 
@Alberto Fuentes 
@Kurro Lopez 

Comunidad de Desarrolladores en francés:

@Pierre LaFay 
@Guillaume Rongier 
@Sylvain Guilbaud 
@Iryna Mykhailova 
@Lorenzo Scalese 

Comunidad de Desarrolladores en chino:

@姚 鑫
@Johnny Wang 
@Jeff Liu 
@Jingwei Wang 
@Lilian Huang 

Comunidad de Desarrolladores en japonés:

@Toshihiko Minamoto 
@Mihoko Iijima 
@Megumi Kakechi 
@Hiroshi Sato 
@Seisuke Nakahashi 

@Tomoko Furuzono 

Comunidad de Desarrolladores
en portugués:

@Danusa Calixto 
@Heloisa Paiva 
@Larissa Prussak 
@Eike Scudellari Franco 
@Rochael Ribeiro 
@Julio Esquerdo 
@Andre Larsen Barbosa 

 
 
Nominación: Estrella Emergente — Edición del 10.º Aniversario

@姚 鑫
@Muhammad Waseem 

Extendemos nuestro más sincero agradecimiento a los galardonados con estos premios y a todos los miembros que han contribuido con su tiempo, experiencia y entusiasmo a la Comunidad de Desarrolladores durante la última década. ¡Vuestros esfuerzos han construido una base sólida para los años venideros!

¡Felicidades a todos los homenajeados y gracias por formar parte de este hito!

Discussion (0)1
Log in or sign up to continue
Question
· Dec 19, 2025

Recommended way to compile CSP files on server

We have created a CSP application in the path /csp/ourapp. Due to some session handling issues, we created a new web application /csp/ourapp/hl7mapping that points to the sane namespace, and we now access the CSP pages using this new URL. This works fine in the local system.

After deploying the app to server, we are facing issues around compiling CSP pages.

 

We noticed that following compilation command works for CSP files located under the physical path /csp/ourapp, but it does not compile the CSP files placed under /CSP/ourapp/hl7mapping.

do $SYSTEM.CSP.LoadPageDir("/CSP/ourapp/","ck")

Because of this we compiled the CSP files manually using Ensemble studio connected to server.

Is there a recommended way to compile CSP files when using a custom web application path?

 

Thanks in advance,

2 Comments
Discussion (2)2
Log in or sign up to continue