GDB - A melhor ferramenta para encontrar suas: Falha de segmentação

O bug do ódio.


SEGMENTATION FAULT on Verifone SC 5000

Quem que trabalha com C/C++ nunca se deparou com um erro chato de Falha de segmentação ? Suas irritações podem acabar quando você utilizar o GDB: The GNU Project Debugger

Introdução

O GDB, o depurador do GNU Project, permite que você veja o que está acontecendo dentro de outro programa enquanto ele é executado - ou o que outro programa estava fazendo no momento em que caiu.

O GDB pode fazer quatro tipos principais de coisas (além de outras coisas) para ajudá-lo a detectar bugs:

  • Inicie seu programa, especificando qualquer coisa que possa afetar seu comportamento.
  • Faça seu programa parar em condições especificadas.
  • Examine o que aconteceu quando o seu programa parou.
  • Mude as coisas no seu programa, para que você possa experimentar a correção dos efeitos de um bug e aprender sobre outro.

Esses programas podem estar em execução na mesma máquina que o GDB (nativo), em outra máquina (remota) ou em um simulador. O GDB pode ser executado nas variantes UNIX e Microsoft Windows mais populares, bem como no macOS.

Quais idiomas o GDB suporta?

O GDB suporta os seguintes idiomas (em ordem alfabética):

  • Ada
  • Assembly
  • C
  • C++
  • D
  • Fortran
  • Go
  • Objetivo-C
  • OpenCL
  • Modula-2
  • Pascal
  • Rust

Instalação

A maioria dos sistemas baseados em UNIX como Linux e BSD possui o GDB no repositório das distros, então basta você instalar via o comando de instalação de pacotes da sua distro, exemplo no Gentoo

emerge gdb

Como utilizar o GDB

Bom, o problema mais comum fica geralmente fica confuso do programador descobrir é a famosa Falha de segmentação . Vejamos aqui um exemplo.

Supondo que você possua o seguinte código escrito em C++ :

#include <iostream>

class TerminalRoot {
  public:
    int min2sec( int * min ){
       return *(min) * 60; 
    }
};

int main(){
  TerminalRoot ter;
  int *num = NULL;
  std::cout << ter.min2sec( num ) << '\n';
  return 0;
}

E seu cófigo compila normalmente sem erros ou warnings, mas quando você tentar rodar, obtém a falha de segmentação:

Falha de segmentação

Ou seja, fica ainda mais difícil sem a ajuda do compilador, é aí que entra o trabalho do GDB!

  • Primeiramente use o GDB indicando o binário:
gdb ./binario

GDB 1

  • Depois rode o comando run dentro do GDB e percebemos que ele não mostra muito sobre o erro, nem usando o comando backtrace.

    Para saber mais sobre os comandos do GDB rode o comando help

GDB 2

  • Quando isso acontece, preciso recompilar com o parâmetro -g3 que removemos a otimização do compilador e ficará mais fácil de verificar. Mas antes tente o comando frame e também o info line *$rip do GDB:

    Para sair do GDB tecle quit

Recompilei com o -g3 e pronto, está lá o erro é na linha 6 e verificando percebemos que o ponteiro está NULO 😀️

GDB 3

Conlusão

Talvez esse exemplo ou a simplicidade do mesmo dificultou um pouco de ver o poder do GDB. Mas posso lhe garantir que ele já me salvou várias vezes.

Para mais informações use o manual e o help do GDB:

gdb --help
man gdb

Links úteis

Valeu!


gnu memtool cpp linguagemc programacao


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!