Gdb | Solyd One
- Gdb | Solyd One
Vídeo de resolução do CTF SolydOne: 🔗 Clique aqui
GNU Debugger (GDB) — Guia Prático e Objetivo
O GDB (GNU Debugger) é o depurador padrão do ecossistema GNU. Ele permite inspecionar, controlar e modificar a execução de programas compilados, especialmente em C e C++.
Compatível com:
- GNU Debugger
- GCC
- Clang
- Executáveis ELF em sistemas Unix-like
1. Compilando com símbolos de debug
Para que o GDB funcione corretamente, o binário deve conter debug symbols:
gcc -g -O0 main.c -o app
Flags importantes
| Flag | Função |
|---|---|
-g | Inclui símbolos de debug |
-O0 | Desativa otimizações (evita code reordering) |
-Wall | Ativa warnings |
Evite -O2/-O3 durante debug, pois podem:
- Remover variáveis
- Inline functions
- Reordenar código
2. Iniciando o GDB
gdb ./app
Ou já executando com argumentos:
gdb --args ./app arg1 arg2
3. Fluxo básico de depuração
Executar programa
run
Definir breakpoint
break main
break 42
break minha_funcao
Listar breakpoints
info breakpoints
Remover breakpoint
delete 1
4. Controle de execução
| Comando | Ação |
|---|---|
run | Inicia |
continue | Continua execução |
next | Próxima linha (step over) |
step | Entra na função (step into) |
finish | Sai da função atual |
until | Executa até linha específica |
5. Inspeção de estado
Ver variáveis
print x
p x
Inspecionar memória
x/4x &x
Formato:
x/[quantidade][formato]
Exemplos:
x/10i $rip→ mostra 10 instruções assemblyx/8xb &buffer→ 8 bytes em hex
Ver registradores
info registers
6. Stack e backtrace
Backtrace
bt
Mostra a call stack.
Navegar na stack
frame 1
info locals
info args
7. Debug de segmentation fault
Quando ocorre SIGSEGV:
- Execute com GDB
- Após crash:
bt
- Verifique ponteiros:
print ptr
print *ptr
Problemas comuns:
- Ponteiro NULL
- Uso após free
- Overflow de buffer
8. Watchpoints
Monitorar alteração de variável:
watch x
GDB pausa quando o valor mudar.
9. Condicionais em breakpoints
break 45 if x == 10
Extremamente útil para loops.
10. Debug em nível assembly
disassemble main
layout asm
Modo TUI:
gdb -tui ./app
Permite visualizar:
- Código
- Assembly
- Registradores
11. Debug de core dump
Habilitar core dump:
ulimit -c unlimited
Após crash:
gdb ./app core
12. Debug remoto (gdbserver)
No servidor:
gdbserver :1234 ./app
Na máquina local:
gdb ./app
target remote ip:1234
13. Exemplos práticos
Código com erro
#include <stdio.h>
int main() {
int *p = NULL;
printf("%d\n", *p);
return 0;
}
Debug
gdb ./app
run
bt
Resultado:
- Identifica dereference de ponteiro NULL
- Mostra linha exata
14. Customização
Arquivo .gdbinit:
set pagination off
set print pretty on
Aliases úteis:
alias ll = info locals
15. Comandos essenciais (resumo)
run
break
next
step
continue
print
bt
info locals
info registers
watch
disassemble
16. Integração com IDEs
O GDB é usado internamente por:
- Visual Studio Code (via extensão C/C++)
- CLion
- Eclipse CDT
17. Boas práticas
- Compile com
-g -O0 - Reproduza bug determinístico
- Use breakpoints condicionais
- Sempre use
btapós crash - Combine com
valgrindpara memória
18. Nível avançado
- Reverse debugging (
record) - Python scripting no GDB
- Debug multi-thread (
info threads) - Attach em processo vivo:
gdb -p PID