Debugando Rust no VS Code
Tags: rust, debug, vscode, braziliandevs
Published: 2021-04-09 15:01:39

_Versão em inglês [aqui](https://dev.to/rogertorres/debugging-rust-with-vs-code-11dj)_.

Bem no começo da minha carreira (2008), consegui um trampo de desenvolvedor Oracle PL/SQL. Eu ainda não sei bem o porquê, mas a gente não usava qualquer debugger na época. Pra corrigir os bugs, a guriada adicionava mensagens pelo código, tentando isolar o problema. Os mais safos fazia algo como uma "busca binária", criando mensagens a cada 100 linhas (ex.: entre as linhas 300 e 400), descobrindo entre quais linhas estava o problema e, então, refinavam a busca, colocando mensagens a cada 10 linhas (ex.: 310, 320 e assim vai).

Quando eu deixei de trabalhar com Oracle e passei a trablhar com SAP (que tem um debugger fantástico) eu descobri um mundo novo. Então, quando chegou a hora de eu trocar de tecnologia de novo (para Rust), eu fui imediatamente atormentado pela pergunta: "eu vou ter debugger lá?"

Essa é a resposta que eu encontrei.

-----

## O que te trouxe aqui: debugando Rust no VSCode

*Primeiro*, você precisa de uma extensão:
- Usando **Unix** (Mac, Linux, ...)? Baixe [CodeLLDB](https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb)
- Usando **Windows?** Baixe [C/C++](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools)

_Por que_ você precisa disso??
- **Resposta curta**: O compilador do Rust usa LLVM para interagir com a máquina, e estas extensões permitem que você interaja com o código que roda nesse nível (já que, cê sabe, o Rust é compilado).
- **Resposta longa**: Ai você me complica. Dá uma olhada nesse site [aqui](https://www.infoworld.com/article/3247799/what-is-llvm-the-power-behind-swift-rust-clang-and-more.html) (em inglês).

Agora, no seu VSCode, siga esses passos (o meu VSCode tá em inglês, mas acho que é tranquilo pra você se achar, caso o seu esteja em pt-brazuca): `Run` > `Start Debugging` > `Ok` > `Yes`
![First step](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ftl8okpayl8084eubg8d.png)

![Second step](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a4qb4ntz6jgok1h7eyjk.png)

![Third step](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6j52awfjvl5fgsj2laui.png)

O resultado esperado é a criação do arquivo `/.vscode/launch.json` que se parece algo com isso:

```json
// Arquivo copiado de um MacOS X
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug unit tests in library 'yourprogram'",
            "cargo": {
                "args": [
                    "test",
                    "--no-run",
                    "--lib",
                    "--package=yourprogram"
                ],
                "filter": {
                    "name": "yourprogram",
                    "kind": "lib"
                }
            },
            "args": [],
            "cwd": "${workspaceFolder}"
        }
    ]
}
```
Ou isso, se você estiver no Windows:
```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(Windows) Launch",
            "type": "cppvsdbg",
            "request": "launch",
            "program": "${workspaceRoot}/target/debug/yourprogram.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "console": "externalTerminal"
        }
    ]
}
```

Se por algum motivo os arquivos não forem criados para você, podes copiar e colar (a pasta _.vscode_ fica no mesmo nível da pasta _src_).

Além do fato de os exemplos serem de SOs diferentes, o primeiro exemplo é de um programa com biblioteca (_library crate_; `--lib`), já o segundo é com binário (_binary crate_; `--bin`). Se você tiver os dois no mesmo projeto, você poderá ter duas ou três entradas em `configurations`.

Agora, teoricamente, você será capaz de adicionar um breakpoint no seu código (clicando na coluna da esquerda para criar esse ponto vermelho).![Fourth Step](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ztrklc0dil1rlyr60jg1.png)Se você não consegue criar o breakpoint, provavelmente é porque você está com essa opção desativada. Para resolver isso, vá em **Configurações** (**Settings**) e selecione **Debug** (no meu caso, está debaixo de *Features*—mas você pode digitar "breakpoint" na barra de busca para encontrá-lo rapidamente) e habilite a opção __"Allow Breakpoints Everywhere"__ (_"Permitir Pontos de Parada em Todos os Lugares"_, ou coisa parecida).![Allow Breakpoints Everywhere](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0knvx5zuugso8ag9xakx.png)

Com os breakpoints acionados, aperte `F5` ou `Run` > `Start Debugging` (que deve funcionar agora que você tem o arquivo). O resultado deve ser algo assim:![Fifth Step](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p4t3v8ipylq8jk98i68s.png)

Basicamente, na esquerda, você tem os valores carregados na memória. As coisas são bem simples enquanto você está lidando com tipos como estes inteiros que eu tenho aqui, mas podem ficar complicadas se você estiver debugando um código com coisas como HashMaps. De qualquer forma, bem melhor que nada.

_Não funcionou?_ Bom, não vai ser a primeira vez que alguém segue um tutorial na internet e não dá certo, né :) Mas comenta aí (mesmo se você tiver resolvido sozinho), porque há grandes chances de outra pessoa ter um problema similar.

## Ações do Debugger
![Actions](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/61xoqkjfe8b9lcwasws9.png)Pra finalizar, essas são as ações que o debugger te permite (da esquerda pra direita):
- `F5` _**Continue**_: executa o programa até ele alcançar o próximo breakpoint (ou até o fim, se ele não achar nenhum).
- `F10` _**Step Over**_: Executa o próximo passo sem entrar nele; por exemplo, se for uma função, ele executa toda ela sem entrar nela.
- `F11` _**Step Into**_: Executa o próximo passo, mas, ao contrário do F10, entra no subprocesso.
- `Shift`+`F11` _**Step out**_: Executa o código até ir para um nível acima; por exemplo, se estiver numa função, ele executa tudo até chegar no código que chamou a função.
- `Shift`+`Cmd`/`Ctrl`+`F5` _**Restart**_: Executa tudo do começo.
- `Shift`+`F5` _**Stop**_: Interrompe a execução.

E é isso. Agora você já é mais safo que a guriada do meu primeiro emprego. 

_A foto da capa é do [Danilo Batista](https://unsplash.com/photos/ljDl1LoPxRY)_.