Skip to main content

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

FlagFunção
-gInclui símbolos de debug
-O0Desativa otimizações (evita code reordering)
-WallAtiva 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

ComandoAção
runInicia
continueContinua execução
nextPróxima linha (step over)
stepEntra na função (step into)
finishSai da função atual
untilExecuta 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 assembly
  • x/8xb &buffer → 8 bytes em hex

Ver registradores

info registers

6. Stack e backtrace

Backtrace

bt

Mostra a call stack.

frame 1
info locals
info args

7. Debug de segmentation fault

Quando ocorre SIGSEGV:

  1. Execute com GDB
  2. Após crash:
bt
  1. 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 bt após crash
  • Combine com valgrind para 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