0% acharam este documento útil (0 voto)
6 visualizações25 páginas

Debug em Rust Vs Python

O documento compara as abordagens de debug em Rust e Python, destacando que Rust prioriza a prevenção de erros em tempo de compilação através de tipos e ownership, enquanto Python lida com muitos erros em tempo de execução. Rust utiliza ferramentas como println!, dbg!, Result e Option para um tratamento de erros mais explícito e seguro, enquanto Python confia em exceções. A abordagem de Rust força os desenvolvedores a pensar criticamente sobre a gestão de memória e possíveis falhas, resultando em um código mais robusto.
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
6 visualizações25 páginas

Debug em Rust Vs Python

O documento compara as abordagens de debug em Rust e Python, destacando que Rust prioriza a prevenção de erros em tempo de compilação através de tipos e ownership, enquanto Python lida com muitos erros em tempo de execução. Rust utiliza ferramentas como println!, dbg!, Result e Option para um tratamento de erros mais explícito e seguro, enquanto Python confia em exceções. A abordagem de Rust força os desenvolvedores a pensar criticamente sobre a gestão de memória e possíveis falhas, resultando em um código mais robusto.
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

11/03/2026, 12:48 Debug em Rust vs Python

ChatGPT 5.4 Thinking Memória desativada

Sou programador Python aprendendo Rust, tenha ótima


didática e faça correlação entre as linguagens, mostre
como o rust trabalha comSou programador Python
aprendendo Rust, tenha ótima didática e faça correlação
entre as linguagens, mostre como o rust trabalha com
debug profissional

Pensou por dois segundos

Perfeito. Vou te explicar Rust com paralelo direto com Python, mas focando no que você
pediu: como o Rust trabalha com debug profissional.

Visão geral
Se no Python você está acostumado com:

print()
logging

pdb

stack trace em tempo de execução


testes com pytest
inspeção dinâmica de variáveis

no Rust o debug profissional costuma envolver um conjunto mais rígido e poderoso:

println!() e dbg!() para inspeção rápida


cargo check para validar sem compilar tudo

cargo test para reproduzir bugs

RUST_BACKTRACE=1 para stack trace detalhado

Result , Option e tratamento explícito de erro

panic!() apenas para falhas irrecuperáveis

log , tracing e env_logger para observabilidade real

gdb / lldb para debug nativo

clippy e fmt para qualidade profissional

tipos e ownership evitando classes inteiras de bugs antes da execução

A maior mudança mental é esta:

[Link] 1/25
11/03/2026, 12:48 Debug em Rust vs Python

Python detecta muitos problemas em runtime. Rust tenta impedir esses problemas
antes mesmo do programa rodar.

1) Debug mental: Python vs Rust


Em Python
Você escreve algo assim:

Python Executar

def dividir(a, b):


return a / b

print(dividir(10, 0))

Erro:

Python Executar

ZeroDivisionError

O programa roda, chega naquele ponto e quebra.

Em Rust

Rust

fn dividir(a: f64, b: f64) -> f64 {


a / b
}

fn main() {
println!("{}", dividir(10.0, 0.0));
}

Aqui o comportamento depende do tipo numérico e da situação.


Com f64 , você pode obter inf em vez de panic. Já com acesso inválido a índice, unwrap
incorreto, overflow em debug etc., o Rust pode parar.

A diferença importante não é só “quebrar ou não quebrar”.


A diferença é que Rust força você a pensar antes:

[Link] 2/25
11/03/2026, 12:48 Debug em Rust vs Python

esse valor pode não existir?


esse erro pode acontecer?
quem é o dono da memória?
esse dado ainda está válido?
essa referência pode ser mutável ao mesmo tempo que outra?

Esse é o começo do “debug profissional” em Rust:


muitos bugs deixam de ser bugs de runtime e viram erros de compilação.

2) Primeiro nível de debug: println! e dbg!


Python

Python Executar

x = [1, 2, 3]
print(x)

Rust com println!

Rust

fn main() {
let x = vec![1, 2, 3];
println!("{:?}", x);
}

No Rust, {:?} usa o formato de debug.

Rust com dbg!


O equivalente mais útil para inspeção rápida é:

Rust

fn main() {
let x = vec![1, 2, 3];
dbg!(&x);
}

Saída típica:

[Link] 3/25
11/03/2026, 12:48 Debug em Rust vs Python

Rust

[src/[Link]:5] &x = [
1,
2,
3,
]

Por que dbg!() é profissionalmente útil?


Porque ele mostra:
arquivo
linha
expressão avaliada
valor

Em Python, você normalmente faria isso manualmente.


Em Rust, dbg!() já traz contexto.

Exemplo comparando com Python

Python

Python Executar

def soma(a, b):


print("a =", a, "b =", b)
return a + b

print(soma(2, 3))

Rust

Rust

fn soma(a: i32, b: i32) -> i32 {


dbg!(a, b);
a + b
}

fn main() {
let r = soma(2, 3);
dbg!(r);
}

[Link] 4/25
11/03/2026, 12:48 Debug em Rust vs Python

3) Debug de erro: Option e Result


Aqui está uma das maiores diferenças para Python.

Python: erro costuma ser exceção

Python Executar

def pegar_primeiro(lista):
return lista[0]

print(pegar_primeiro([]))

Isso quebra em runtime.

Rust: ausência de valor é explícita

Rust

fn pegar_primeiro(lista: &[i32]) -> Option<i32> {


[Link]().copied()
}

fn main() {
let lista: Vec<i32> = vec![];
let primeiro = pegar_primeiro(&lista);

match primeiro {
Some(v) => println!("Primeiro: {}", v),
None => println!("Lista vazia"),
}
}

Correlação com Python


Em Python, você pensa:
“vou tentar e pegar a exceção”

Em Rust, você pensa:


“esse caso pode falhar, então o tipo já me obriga a tratar”

Isso reduz muito bug escondido.

[Link] 5/25
11/03/2026, 12:48 Debug em Rust vs Python

Result<T, E> : o equivalente profissional de tratamento de erro

Python

Python Executar

def ler_arquivo():
with open("[Link]", "r", encoding="utf-8") as f:
return [Link]()

Se o arquivo não existir, exceção.

Rust

Rust

use std::fs;

fn ler_arquivo() -> Result<String, std::io::Error> {


fs::read_to_string("[Link]")
}

fn main() {
match ler_arquivo() {
Ok(conteudo) => println!("{}", conteudo),
Err(e) => eprintln!("Erro ao ler arquivo: {}", e),
}
}

4) O erro mais comum de iniciante: unwrap()


Em Python
Muitos iniciantes fazem algo equivalente a assumir que tudo vai dar certo.

Em Rust
Você pode fazer isso com unwrap() :

Rust

use std::fs;

fn main() {
let conteudo = fs::read_to_string("[Link]").unwrap();

[Link] 6/25
11/03/2026, 12:48 Debug em Rust vs Python

println!("{}", conteudo);
}

Se falhar, o programa dá panic! .

Regra profissional
Use unwrap() :
em protótipo rápido
em teste
quando você tem garantia forte e explícita

Evite em produção, porque isso transforma erro previsível em crash.

Melhor abordagem

Rust

use std::fs;

fn main() {
match fs::read_to_string("[Link]") {
Ok(conteudo) => println!("{}", conteudo),
Err(e) => eprintln!("Falha ao ler arquivo: {}", e),
}
}

Ou com propagação:

Rust

use std::fs;
use std::io;

fn ler() -> io::Result<String> {


let conteudo = fs::read_to_string("[Link]")?;
Ok(conteudo)
}

fn main() {
match ler() {
Ok(c) => println!("{}", c),
Err(e) => eprintln!("Erro: {}", e),
}
}

[Link] 7/25
11/03/2026, 12:48 Debug em Rust vs Python

5) O operador ? e a comparação com Python


No Python, você tende a escrever:

Python Executar

def processar():
try:
with open("[Link]") as f:
return [Link]()
except Exception as e:
print("Erro:", e)
return None

No Rust:

Rust

use std::fs;
use std::io;

fn processar() -> io::Result<String> {


let conteudo = fs::read_to_string("[Link]")?;
Ok(conteudo)
}

O que ? faz?
Se der erro:

retorna imediatamente da função


propaga o erro

Se der certo:
extrai o valor

Mentalidade equivalente
Python: try/except
Rust: Result + ?

Mas no Rust isso fica no tipo, então o compilador participa do controle de erro.

6) Stack trace profissional com RUST_BACKTRACE=1


Quando ocorre panic! , você pode ver rastreamento de pilha.

[Link] 8/25
11/03/2026, 12:48 Debug em Rust vs Python

Windows (cmd)

cmd

set RUST_BACKTRACE=1
cargo run

PowerShell

PowerShell

$env:RUST_BACKTRACE="1"
cargo run

Exemplo

Rust

fn main() {
let v = vec![10, 20, 30];
println!("{}", v[10]);
}

Isso vai dar panic por índice fora do limite.

Com backtrace ativado, você verá onde o erro ocorreu e a cadeia de chamadas.

Correlação com Python


Isso lembra o traceback do Python, mas em Rust ele é especialmente útil quando ocorre
panic! em código mais profundo.

7) cargo check : o “linter + verificador sem executar”


No Python, você pode usar:
python -m py_compile

mypy

ruff

pytest

IDE inspection

No Rust, um dos comandos mais importantes é:

[Link] 9/25
11/03/2026, 12:48 Debug em Rust vs Python

Bash

cargo check

O que ele faz?


valida tipos
ownership
borrowing
lifetimes básicos
sem gerar binário final completo

É muito rápido e faz parte do fluxo profissional.

Uso real
Durante desenvolvimento:

Bash

cargo check
cargo test
cargo run

Essa sequência é extremamente comum.

8) clippy : detectando code smells e bugs sutis


Ferramenta profissional obrigatória no ecossistema Rust:

Bash

cargo clippy

Ele aponta:
padrões ruins
alocações desnecessárias
cópias evitáveis
formas mais idiomáticas
possíveis erros lógicos

Comparação com Python


É como um misto de:
[Link] 10/25
11/03/2026, 12:48 Debug em Rust vs Python

ruff

flake8

sugestões de refatoração
algumas validações de qualidade

9) cargo test : debug guiado por reprodução


Em Python, você provavelmente usa pytest .

Em Rust:

Rust

fn soma(a: i32, b: i32) -> i32 {


a + b
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_soma() {
assert_eq!(soma(2, 3), 5);
}
}

Rodando:

Bash

cargo test

Isso é central para debug profissional


Porque bug profissional não se resolve “olhando”.
Resolve-se assim:
1. reproduz o problema
2. transforma em teste
3. corrige
4. garante que não volta

Essa disciplina vale para Python e Rust.


A diferença é que Rust te ajuda ainda mais porque o tipo já bloqueia muita regressão.
[Link] 11/25
11/03/2026, 12:48 Debug em Rust vs Python

10) panic! não é tratamento de erro


Essa é uma distinção muito importante.

Python
Muita gente usa exceção para tudo.

Rust
Há duas categorias:

1. Erro esperado
Use Result

Exemplo:

arquivo não encontrado


parse inválido
conexão falhou

2. Falha irrecuperável / bug de programação


Use panic!

Exemplo:

estado impossível
contrato interno violado
índice inválido por erro lógico grave

Exemplo ruim

Rust

use std::fs;

fn carregar_config() -> String {


fs::read_to_string("[Link]").unwrap()
}

Exemplo melhor

[Link] 12/25
11/03/2026, 12:48 Debug em Rust vs Python

Rust

use std::fs;
use std::io;

fn carregar_config() -> io::Result<String> {


fs::read_to_string("[Link]")
}

11) Debug de ownership: o grande divisor de águas


Aqui está o ponto em que Rust realmente muda sua cabeça de programador Python.

Python
Objetos são referências por padrão e o GC resolve muita coisa.

Python Executar

lista = [1, 2, 3]
outra = lista
[Link](4)
print(lista) # [1, 2, 3, 4]

Isso pode gerar bugs por aliasing.

Rust
O compilador força clareza sobre posse e empréstimo.

Rust

fn main() {
let v = vec![1, 2, 3];
let w = v;
// println!("{:?}", v); // erro: valor foi movido
println!("{:?}", w);
}

O que aconteceu?
v foi movido para w .

[Link] 13/25
11/03/2026, 12:48 Debug em Rust vs Python

No começo isso parece irritante.


Depois você percebe: isso elimina uma classe enorme de bugs de uso indevido de
memória e estado compartilhado confuso.

Empréstimo imutável

Rust

fn imprimir(v: &Vec<i32>) {
println!("{:?}", v);
}

fn main() {
let v = vec![1, 2, 3];
imprimir(&v);
println!("{:?}", v);
}

Empréstimo mutável

Rust

fn adicionar(v: &mut Vec<i32>) {


[Link](4);
}

fn main() {
let mut v = vec![1, 2, 3];
adicionar(&mut v);
println!("{:?}", v);
}

Correlação com Python


Python deixa você compartilhar referência à vontade.
Rust exige que você declare intenção:
vou só ler? &T
vou modificar? &mut T
vou transferir posse? T

Isso já é, por si só, um mecanismo de debug preventivo.

[Link] 14/25
11/03/2026, 12:48 Debug em Rust vs Python

12) Logging profissional: log e tracing


Nível básico: println! e dbg!
Bom para teste rápido.

Nível profissional: logs estruturados


Com crates como:
log

env_logger
tracing

tracing-subscriber

Exemplo com log


[Link] :

TOML

[dependencies]
log = "0.4"
env_logger = "0.11"

[Link] :

Rust

use log::{error, info, warn};

fn main() {
env_logger::init();

info!("Aplicação iniciada");
warn!("Isso é um aviso");
error!("Isso é um erro");
}

Rodando no PowerShell:

PowerShell

$env:RUST_LOG="info"
cargo run

Comparando com Python

[Link] 15/25
11/03/2026, 12:48 Debug em Rust vs Python

Muito parecido com:

Python Executar

import logging

[Link](level=[Link])
[Link]("Aplicação iniciada")

Mas no ecossistema Rust, para sistemas robustos, tracing costuma ser ainda melhor.

Exemplo mental de quando usar cada coisa


dbg!() → inspeção local rápida

println!() → saída simples


eprintln!() → erro no stderr

log → aplicação tradicional

tracing → sistema profissional, concorrente, serviços e observabilidade séria

13) Debug com tracing : visão moderna


tracing é muito usado em aplicações mais sérias, especialmente:

backend
async
microserviços
sistemas concorrentes

Ele permite registrar contexto melhor do que log textual simples.

Exemplo conceitual:

Rust

use tracing::{error, info};

fn processar(id: u32) {
info!(pedido_id = id, "Iniciando processamento");
error!(pedido_id = id, "Falha no processamento");
}

Em vez de só texto, você registra campos estruturados.

[Link] 16/25
11/03/2026, 12:48 Debug em Rust vs Python

Comparação com Python


Isso se aproxima de logging estruturado em Python com:

structlog
loguru

logging JSON

Mas em Rust isso costuma ficar muito integrado ao desenho do sistema.

14) Debug nativo com gdb e lldb


Quando o caso exige baixo nível de verdade, Rust pode ser depurado como linguagem
nativa compilada.

Você pode usar:

gdb
lldb

depurador da IDE (VS Code, RustRover, etc.)

Casos em que isso é útil


crash nativo
comportamento estranho em FFI
concorrência
corrupção em integração com C
inspeção de stack/frame
stepping detalhado

Comparação com Python


No Python, o debug costuma ser muito mais interpretado e dinâmico.
No Rust, você entra no território de linguagem de sistema: breakpoint real, stepping em
nível compilado, inspeção de memória e frames.

15) Build de debug vs release


Isso é importantíssimo.

Build de debug

[Link] 17/25
11/03/2026, 12:48 Debug em Rust vs Python

Bash

cargo run

compila com símbolos de debug


mais lento
melhor para investigação
checagens extras em alguns casos

Build de release

Bash

cargo run --release

otimizado
mais rápido
debugging mais difícil
comportamento temporal pode mudar

Comparação com Python


Python normalmente não tem essa separação tão marcante no dia a dia.
Em Rust, essa diferença faz parte do fluxo profissional.

16) Exemplo completo: do estilo Python para estilo Rust


Python

Python Executar

def media(numeros):
return sum(numeros) / len(numeros)

print(media([]))

Bug: divisão por zero.

Rust ingênuo

Rust

[Link] 18/25
11/03/2026, 12:48 Debug em Rust vs Python

fn media(numeros: &[f64]) -> f64 {


let soma: f64 = [Link]().sum();
soma / [Link]() as f64
}

fn main() {
let nums: Vec<f64> = vec![];
println!("{}", media(&nums));
}

Rust profissional

Rust

fn media(numeros: &[f64]) -> Option<f64> {


if numeros.is_empty() {
return None;
}

let soma: f64 = [Link]().sum();


Some(soma / [Link]() as f64)
}

fn main() {
let nums: Vec<f64> = vec![];

match media(&nums) {
Some(valor) => println!("Média: {}", valor),
None => eprintln!("Não é possível calcular média de lista vazia"),
}
}

O que melhorou?
o erro foi modelado no tipo
o chamador é forçado a tratar
o bug deixou de ser silencioso

Esse é o coração do Rust.

17) Fluxo profissional de debug em Rust


Aqui vai um fluxo muito bom para você adotar.

Etapa 1 — validar rapidamente


[Link] 19/25
11/03/2026, 12:48 Debug em Rust vs Python

Bash

cargo check

Etapa 2 — formatar código

Bash

cargo fmt

Etapa 3 — lint forte

Bash

cargo clippy

Etapa 4 — rodar testes

Bash

cargo test

Etapa 5 — reproduzir manualmente

Bash

cargo run

Etapa 6 — se houver panic


No PowerShell:

PowerShell

$env:RUST_BACKTRACE="1"
cargo run

Etapa 7 — adicionar inspeção local


Use:

dbg!()

eprintln!()

logs com tracing

[Link] 20/25
11/03/2026, 12:48 Debug em Rust vs Python

Etapa 8 — transformar bug em teste


Sempre que possível, crie um teste reproduzindo a falha.

18) Equivalência rápida: Python → Rust


Python Rust

print() println!()

inspeção improvisada dbg!()

exceção Result<T, E>

None Option<T>

try/except match / ?

traceback RUST_BACKTRACE=1

pytest cargo test

flake8/ruff cargo clippy

tipagem opcional tipagem forte obrigatória

GC ownership + borrowing

debug em runtime prevenção no compile time + debug nativo

19) O que você precisa desaprender vindo do Python


Algumas ideias que funcionam em Python e atrapalham no Rust:

1. “Eu vejo depois em runtime”


No Rust, o ideal é modelar corretamente antes.

2. “Se der ruim, lanço exceção”


No Rust, erro esperado deve ir para Result .

3. “Posso compartilhar referência sem pensar”


[Link] 21/25
11/03/2026, 12:48 Debug em Rust vs Python

No Rust, você precisa decidir posse, empréstimo e mutabilidade.

4. “Debug é só print”
No Rust profissional, debug é:
tipos corretos
tratamento explícito
testes
logs
backtrace
ferramentas do cargo

20) O que você ganha com essa disciplina


Quando você abraça o modelo do Rust, começa a perceber que:
menos bugs chegam à produção
concorrência fica mais segura
refatoração fica mais confiável
erros ficam mais explícitos
o compilador vira parceiro de debugging

Essa é a sensação correta de quem sai do Python para o Rust:

no começo o compilador parece “duro”; depois você percebe que ele está te
impedindo de criar problemas caros.

21) Exemplo final: estilo Python e estilo Rust lado a lado


Python

Python Executar

def buscar_usuario(dados, nome):


return dados[nome]

usuarios = {"ana": 20, "joao": 30}


print(buscar_usuario(usuarios, "maria"))

Pode dar KeyError .

[Link] 22/25
11/03/2026, 12:48 Debug em Rust vs Python

Rust

Rust

use std::collections::HashMap;

fn buscar_usuario(dados: &HashMap<String, i32>, nome: &str) -> Option<i32> {


[Link](nome).copied()
}

fn main() {
let mut usuarios = HashMap::new();
[Link]("ana".to_string(), 20);
[Link]("joao".to_string(), 30);

match buscar_usuario(&usuarios, "maria") {


Some(idade) => println!("Idade: {}", idade),
None => eprintln!("Usuário não encontrado"),
}
}

Leitura didática
Em Python:
você tenta acessar e pode falhar

Em Rust:
o tipo já diz que pode não existir

Esse é o motivo de Rust parecer mais verboso, mas também mais seguro.

22) Resumo prático para você decorar


Para debug rápido
Use:

Rust

dbg!(variavel);

Para ver stack trace


No PowerShell:

[Link] 23/25
11/03/2026, 12:48 Debug em Rust vs Python

PowerShell

$env:RUST_BACKTRACE="1"
cargo run

Para checar o projeto rápido

Bash

cargo check

Para testar

Bash

cargo test

Para qualidade de código

Bash

cargo clippy
cargo fmt

Para erro esperado


Use:

Option
Result

Para produção
Prefira:
tratamento explícito
logs
testes
evitar unwrap()

23) Minha recomendação direta para você, vindo de


Python
[Link] 24/25
11/03/2026, 12:48 Debug em Rust vs Python

Aprenda Rust nesta ordem:


1. let , mut , funções e match
2. Option e Result
3. ownership, borrowing e referências
4. Vec , String , HashMap
5. cargo check , test , clippy
6. dbg! , panic! , RUST_BACKTRACE
7. logs com tracing
8. lifetimes
9. async e concorrência

Se você inverter essa ordem, sofre mais do que precisa.

Posso montar na próxima resposta um guia prático com exemplos lado a lado Python x
Rust para debug, incluindo:

print vs dbg!

exceção vs Result
pdb vs ferramentas de Rust

logging profissional com tracing


um mini projeto real com bug e correção passo a passo.

Is this conversation helpful so far?

[Link] 25/25

Você também pode gostar