O que fazer com uma falha de segmentação 11
por alguma razão, eu decidi construir um produto usando plain C. Se o objetivo era a eficiência de código, foi um desastre. Mas como uma ferramenta para o crescimento pessoal, eu acho que aprendi muito mais sobre programação no processo.
por exemplo, eu agora sei mais precisamente por que um dicionário python e uma lista se comportam de forma diferente, e o que realmente significa “passar por referência”.”
no entanto, se houvesse uma barreira que me faria nunca querer voltar para C, seria a temida “falha de segmentação 11”, seguida de perto por “abortar Armadilha 6.”
estes dois erros ocorrem durante o tempo de execução, tornando-os difíceis de depurar. XCode, Eclipse ou outras ferramentas de depuração são realmente úteis, mas eu aprendi que é muito mais importante aprender o que essas coisas são e chegar a procedimentos para lidar com o processo de depuração. Estas são apenas as minhas notas sobre os meus erros comuns. Espero fazer disso uma lista de solução de problemas para qualquer um que tenha seus próprios problemas. Quero pelo menos cobrir os meus problemas estúpidos, para que te concentres em problemas de codificação.uma falha de segmentação significa que o seu programa tentou aceder a algo que não devia. Isso é parte do problema. Há muitas razões pelas quais um programa pode acessar coisas que não é suposto, mas o código compilado basicamente diz “#$#@^*&!” Sim. Se pensares nisso, não vais querer ter de explicar a alguém porque é que meter-te num sítio sensível te enfurece. Só queres que parem de o fazer. Felizmente, os computadores são burros e surpreendentemente pacientes após cerca de 75 anos de engenharia. Eles vão continuar a enviar falhas de Seg, mas (geralmente) não vai parar de ser amigos depois de acontecer a 1000ª vez.
o que é a armadilha para abortar?não é assim tão diferente. Algures, o teu computador disse-se para abortar o programa. Mais uma vez, não ajudou muito. No entanto, isso normalmente ocorre quando você tenta fazer algo como o acesso string
dos dois char string "nw"
ou falha ao alocar memória suficiente char string
para uma string ou array como o "way"
.o que deve fazer com uma falha de Seg?
os tutoriais que leio tendem a concentrar-se no uso de ferramentas de depuração como o lldb, o gdb e assim por diante. Está tudo muito bem. Sim, você deve executar o gcc -g
primeiro e, em seguida, lldb executable_name
e run -flag1 -flag2
para ver se isso ajuda você a descobrir. Mas às vezes não há qualquer ajuda. Mas tenho uma lista de coisas para verificar.
- verifique se as variáveis globais do seu programa necessário têm valores. Isso aconteceu principalmente porque eu tinha criado bandeiras que preenchiam um monte de valores que precisavam ser definidos antes de correr. No entanto, e se eles não colocarem nada? Falha 11 Do Seg! Houve uma série de vezes em que pensei que os vars eram definidos quando não eram e que eram feitos para bugs desafiadores. Melhor ainda, tente manter os globals a um limite para que eles sejam mais fáceis de rastrear.malloc é seu amigo e inimigo. Especialmente com entradas de usuários, pode ser muito desafiador para alocar memória e, em seguida, copiar, concatenar e fazer qualquer outra coisa ao longo da estrada. Conheça bem este comando e como ele funciona. And don’t forget to
free()
the memory when you are done! - use
char var
para determinar o tamanho de um char* para alocação de memória. A maioria do problema que eu tinha envolvido atribuir variáveis para eventualmente aceitar uma string. Eu vi outros conselhos, mas se é uma string que você está trabalhando com, eu acho que foistrlen()
trabalhou o mais consistentemente. Você precisa do +1 para o\0
(nulo) para terminar o texto no final. - use
int arr) +1)]
para matrizes de outros tipos. É uma forma estranha de fazer as coisas, mas é isso que se consegue com uma linguagem de baixo nível. -
\0
representa nulo e terminará um array. Pode ser útil quando você está tentando evitar problemas de excesso de buffer. - tente usar constantes definidas tanto quanto possível. Sempre que você for capaz de definir as coisas no pré-compile, ele irá salvar o seu tempo de depuração mais tarde.
- compreenda para que servem os ficheiros header. Muitos dos tutoriais irão dizer – lhe o que um arquivo de cabeçalho contém, mas nem sempre é claro para o que eles são. Arquivos Header são capturados no tempo de pré-compilação e fornecem um resumo das variáveis e funções disponíveis para o programa *antes que ele compile*. Isto significa que … os arquivos C incluídos no PROGRAMA serão capazes de acessar essas funções, desde que
#include <headerfile.h>
é adicionado ao arquivo. Uma boa convenção é criar um .h ficheiro sempre que criar um.C file, and include it in the C. - Most for loops go like this:
for (int i=0; i < stop; i++)
An easy way to have a abort trap is to put a ≤ in front ofstop
.mantenha os seus problemas contidos. Tente fazê-lo de modo que cada arquivo faz algumas coisas discretas e nada mais. Se você tem que caçar através de diferentes arquivos sobre e sobre, ele pode fazer encontrar seus problemas de culpa seg realmente difícil.Matemática Computacional é difícil. Não é verdade, mas pequenas coisas causam grandes problemas.char variable
por exemplo, significa um array contendo dois itens, mas como os índices começam em 0, isso significa que você só pode ir até o número 1. - imprimir os textos do formato como o tipo certo. Felizmente, isso geralmente é pego no tempo de compilação, mas ainda pode causar problemas. Certifique-se de que o seu carácter de formato
%{whatever}
se adapta a qualquer variável que queira introduzir nele.é tudo o que tenho por agora. Espero que as minhas misérias lhe tenham poupado dores de cabeça! Se tudo o resto falhar, agora tenho uma lista de coisas para verificar antes de arrancar o cabelo!