Como depurar falhas de segmentação em c?

Como depurar falhas de segmentação em c?

Uma violação de acesso acontece quando a CPU tenta as instruções definidas fora de sua área de memória ou lê ou grava em um local reservado que não existe, resultando em uma falha de segmentação. O presente aplicativo é interrompido como resultado dessa ação, e um resultado designado como falha de segmentação é gerado. Como os dados são frequentemente compartilhados nas regiões de memória em um sistema e o espaço de armazenamento do programa é compartilhado entre os aplicativos, esse problema ocorre.

Algumas máquinas podem sofrer falhas de segmentação, enquanto outras não. Se isso acontecer, geralmente significa que você tem um problema com seu código e conseguimos se safar nesse sistema por sorte. Tudo depende de como a memória é organizada e se é zerada ou não. Examinaremos como identificar o problema de segmentação do programa neste artigo.

Qual é a falha de segmentação?

Uma falha de segmentação, geralmente conhecida como segfault, é uma espécie de erro de computador que acontece quando o processador tenta acessar um endereço de memória fora de sua região de armazenamento de programa devido a uma condição imprevista. O termo "segmentação" refere -se a um método de proteção de memória de memória de memória virtual. Ao trabalhar com ponteiros em C ++/C, freqüentemente encontramos este problema.

Usando o compilador do GDB para falha de segmentação

Para descobrir por que os programas C criam uma falha de segmentação, usaremos o GDB. O GDB é um depurador C (e C ++). Ele permite que o programa seja executado até um ponto específico, depois interrompe e relata os valores das variáveis ​​especificadas naquele momento ou passa pela linha uma linha de cada vez, imprimindo os valores de cada variável após a execução de cada linha. O depurador do GDB nos ajudará a descobrir quais linhas são responsáveis ​​pelo problema de segmentação.

Pontos -chave para evitar falhas de segmentação

Embora as falhas de acesso à memória façam a maioria das falhas de segmentação, é fundamental garantir que os ponteiros usados ​​em um programa sempre se referam a locais de dados aceitáveis. A seguir, são apresentadas as maneiras de evitar falhas de segmentação.

  • Como as falhas de acesso à memória causam a maioria das falhas de segmentação, é fundamental garantir que os ponteiros do aplicativo sempre apontem para locais de dados válidos.
  • Antes de desreferenciar uma referência suscetiva, como uma incorporada em uma estrutura que é mantida em uma lista ou uma matriz, devemos invocar assert ().
  • Lembre -se sempre de inicializar corretamente os ponteiros.
  • Um mutex ou um semáforo pode ser usado para proteger os recursos compartilhados contra acesso simultâneo em multithreading.
  • Devemos usar a função gratuita ()

Exemplo 1: Programa de falha de segmentação por desreferência do ponteiro do bloco de memória em c

Temos uma ilustração de uma falha de segmentação onde estamos tentando ter acesso ao endereço do ponteiro que liberou. Na função principal do programa C a seguir, temos a Declaração de Variável de Ponteiro “Int* A” e alocamos a memória para a variável de ponteiro “A”. Uma falha de segmentação será gerada quando o programa tentar ler do ponteiro de desreferência *a.

#incluir
int main (int argc, char ** argv)

int* a;
*a = 50;
retornar 0;

Na compilação do código acima visto na tela abaixo, a linha *a = 50 causa uma falha de segmentação.

Exemplo 2: Programa de falha de segmentação acessando a matriz fora de fiança em C

Uma falha de segmentação ocorre na maioria dos casos em que um programa tenta ler ou escrever memória além de seus limites. No programa a seguir, declaramos uma gama de índice "10" então, estamos tentando buscar o índice de uma matriz que está esgotada e inicializada com o valor numérico. Este é o ponto em que obteremos falhas de segmentação depois de executar a linha fora do limite do programa.

#incluir
int main (int argc, char ** argv)

int myarr [10];
Myarr [1000] = 2;
retornar 0;

Estamos no compilador do GDB, onde usamos o comando da lista do GDB. O comando da lista do GDB imprimiu a linha de código do programa Valve. Da linha “Myarr [1000] = 2”, temos uma falha de segmentação. Você pode ver no seguinte console do GDB.

Exemplo 3: Programa de falha de segmentação por desreferência do ponteiro nulo em c

Referências são dicas em linguagens de programação que indicam onde um item é armazenado na memória. Um ponteiro nulo é um ponteiro que aponta para nenhum local de memória válido. No programa abaixo, declaramos uma variável de ponteiro “Pointerval” e atribuímos um valor nulo. A exceção do ponteiro nulo é lançado ou a falha de segmentação ocorre quando um ponteiro nulo está desreferenciando na linha “*ponteval = 10”.

#incluir
int main (int argc, char ** argv)

int *pointerval = null;
*Pointerval = 10;
retornar 0;

O resultado do programa acima lançou a falha de segmentação após a execução na linha “*Pointerval = 10” mostrada abaixo.

Exemplo 4: Programa de falha de segmentação por excesso de pilha em c

Mesmo que o código não tenha um único ponteiro, não é um problema de ponteiro. O transbordamento da pilha ocorre quando a função recursiva é invocada repetidamente, consumindo toda a memória da pilha. A corrupção da memória também pode acontecer quando a pilha ficar sem espaço. Pode ser corrigido retornando da função recursiva com uma condição de base.

Aqui no programa, temos a principal função e, no corpo da função principal, invocamos outra função principal. Isso leva à falha de segmentação devido ao transbordamento da pilha.

#incluir
int main (vazio)

principal();
retornar 0;

Você pode ver o compilador GDB fornece a falha de segmentação on -line, onde invocamos a função principal no bloco de funções principal do programa.

Conclusão

O artigo lançou alguma luz sobre o que são falhas de segmentação e como podemos depurar usando o compilador do GDB. O compilador do GDB determina quais linhas são responsáveis ​​pela falha de segmentação. A sessão de depuração das falhas de segmentação é muito fácil de manusear com um compilador de GDB na programação C. Em seguida, tomamos cenários diferentes onde podem ocorrer falhas de segmentação. Espero que este artigo esclareça os problemas de falha de segmentação.