O GDB (GNU Debugger) é uma poderosa ferramenta de depuração (debugging) para programas escritos principalmente nas linguagens C e C++, mas suporta também outras linguagens como [[Go]], [[Rust]], [[Assembly]], entre outras.
Sua principal função é ajudar desenvolvedores e analistas a examinar o comportamento interno dos programas durante a execução, permitindo:
- Execução passo a passo de instruções.
- Definição e acompanhamento de breakpoints.
- Inspeção de valores de variáveis e estruturas de dados.
- Análise de backtraces (pilha de chamadas de funções).
- Modificação de valores em tempo de execução.
É muito utilizado em engenharia reversa, análise de [[malware]] e desenvolvimento de exploits.
## Exemplos Práticos
### Comandos de abertura
```shell
# Abrir um binário.
$ gdb /caminho/para/binario
# Anexar um processo em execução.
$ gdb -p <PID>
# Abrindo um novo binário com o GDB já carregado
(gdb) file /caminho/para/binario | f /caminho/para/binario
# Executar o binário passando parametros.
(gdb) run arg1 arg2 | r arg1 arg2
# Como reler o código fonte.
(gdb) dir
# Para matar o programa em execução
(gdb) kill | k
```
❗O | divide a opção curta da opção longa. Então cuidado ao copiar os comandos.
### Visualizando o Assembly/Código Fonte.
```shell
# Visualizar as linhas do código fonte:
(gdb) list | l
(gdb) list 10 | l 10
(gdb) list 11,13 | l 11,13
# Visualizar o código de Assembly do binário.
(gdb) disassemble | disas
(gdb) disassemble nome_da_funcao | disas nome_da_funcao
```
#### Depurando o código usando Breakpoints:
```shell
# Criando um ponto de parada a partir do código fonte.
(gdb) breakpoint 8 | break 8 | b 8
# Gerar um Breakpoint com endereço de memória.
(gdb) breakpoint *0x0000000000401d2f | break *0x401d2f | b *0x401d2f
# Monitorar a mudança de variáveis
(gdb) watchpoints nome_variavel | watch nome_variavel
# Como listar todos os breakpoints que existem.
(gdb) info breakpoints
# Para apagar os breakpoints:
(gdb) delete numero_do_breakpoint
# Limpa todas as paradas
(gdb) clear
```
### Avançando e voltando no código:
| Comando | Descrição | Entra em funções? | Nível de execução |
| ---------- | --------------------------------------- | ----------------- | -------------------- |
| `next` | Avança uma linha, pula funções chamadas | Não | Código fonte (linha) |
| `step` | Avança uma linha, entra em funções | Sim | Código fonte (linha) |
| `stepi` | Avança uma instrução de máquina | Sim | Assembly (instrução) |
| `continue` | Continua até o próximo breakpoint | - | Executa livremente |
```
(gdb) next | n
(gdb) step
(gdb) stepi
(gdb) continue | c
```
#### Mostrando conteúdo de variáveis
```shell
# Para mostrar as variáveis disponíveis:
(gdb) info variables
(gdb) info variables valor_da_busca
# Para mostrar o conteúdo das variáveis:
(gdb) print $nome_da_variavel
```
#### Visualizando dados em Memória
```
# Imprime 8 bytes em hexadecimal.
x /8x 0x402008
# Imprime 8 caracteres ASCII (UTF-8).
x /8c 0x402008
# Imprime 8 strings.
x /8s 0x402008
# Imprime dados na pilha.
x /8x $sp
```
#### Mudança de layouts
```shell
# Modo de visualização com assembly (precisa do disassemble).
(gdb) layouts asm
# Modo de visualização de registradores.
(gdb) layout regs
# Modo de visualização de tela dividida.
(gdb) layout split
# Modo de visualização de código fonte (se tiver disponível).
(gdb) layout src
# Pular para o próximo layout ou o anterior.
(gdb) layout next
(gdb) layout prev
```
### Outros ajustes
```
### Mudar a forma de leitura do Disassemble
set disassembly-flavor intel
```
### Links Uteis
[https://github.com/pwndbg/pwndbg](https://github.com/pwndbg/pwndbg)
[https://github.com/cyrus-and/gdb-dashboard](https://github.com/cyrus-and/gdb-dashboard)
### Material Complementar


