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