Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
Ryoo

Segmentation fault (core dumped)

Recommended Posts

Boa noite a todos.

Mais cedo estava terminando um trabalho para realizar o cadastro e consulta de veículos em linguagem C, quando me deparei com um problema.

Após testar o algoritmo e faze-lo rodar corretamente utilizando o complilador GCC versão 4.3.2 no SO Ubuntu(versão 10.04 LTS), fui testa-lo no Windows para ver se tb estava funcionando, mas fui surpreendido com um segmentation fault.

Fiz o teste no cygwin e o devc++ e ambos acusam este erro. Utilizando o GDB do cygwin, encontrei as seguintes informações:

Program received signal SIGSEGU, Segmentation fault.

0x00402788 in opcao_nro5()

#0 0x00402788 in opcao_nro5()

#1 0x00402e13 in main()

Esta seria a função dando problemas:

void opcao_nro5 (void){ /*Funcao para gerar um arquivo texto contendo os carros zero km em ordem decresc. de anomodelo e preco*/
tipoDadosEmpresa dados;
tipoOrdenacao zerokm[100];
char aux_carro[15], arquivo[50] = "VEICULOS.bin", arquivo2[50] = "VEICULOS_NOVOS.txt";
int i, swap, total, troca, aux_anomod, aux_cod, aux_km;
float aux_preco;
FILE *fp, *fp2;

fp = fopen(arquivo, "rb");
if(fp == NULL){ /*Se o arquivo nao existir, retorna ao menu principal, pois nao ha o que ser consultado.*/
printf("ERRO! O arquivo de nome ""VEICULOS.bin"" nao existe.\nPressione <ENTER> para retornar.\n");
getchar();
getchar();
}else{
fp2 = fopen(arquivo2, "w");
while(fread(&dados, sizeof(dados), 1, fp)>0){ /*percorre o arquivo contendo os dados*/
if(dados.km==0){ /*copia para o vetor de registros apenas os carros zerokm*/
zerokm[i].km = dados.km;
zerokm[i].cod = dados.cod;
zerokm[i].anomod = dados.anomod;
zerokm[i].preco = dados.preco;
strcpy(zerokm[i].carro, dados.carro);
}
i++;
total++;
}
fclose(fp);
if(total>1){ /*realiza a ordenacao se existirem pelo menos 2 veiculos*/
troca=1;
while(troca){ /*enquanto existirem posições a serem alteradas, o ordenacao continua*/
troca=0;
for(i=0; i<total-1; i++){ /*percorre todo o vetor*/
swap=0;
if(zerokm[i].anomod>zerokm[i+1].anomod){
swap = 1; /*se os anos nao estiverem em ordem crescente, é preciso troca-los*/
}else if((zerokm[i].anomod==zerokm[i+1].anomod)&&(zerokm[i].preco > zerokm[i+1].preco)){
swap = 1; /*se os vizinhos tiverem o mesmo ano, analisa qual deles tem o maior preco*/
}
if(swap==1){ /*realiza a devida ordenacao*/
aux_km = zerokm[i].km;
aux_cod = zerokm[i].cod;
aux_anomod = zerokm[i].anomod;
aux_preco = zerokm[i].preco;
strcpy(aux_carro, zerokm[i].carro);
zerokm[i].km = zerokm[i+1].km;
zerokm[i].cod = zerokm[i+1].cod;
zerokm[i].anomod = zerokm[i+1].anomod;
zerokm[i].preco = zerokm[i+1].preco;
strcpy(zerokm[i].carro, zerokm[i+1].carro);
zerokm[i+1].km = aux_km;
zerokm[i+1].cod = aux_cod;
zerokm[i+1].anomod = aux_anomod;
zerokm[i+1].preco = aux_preco;
strcpy(zerokm[i+1].carro, aux_carro);
troca = 1;
}
}
}
}
fprintf(fp2, "Ano\tCodigo\tCarro\t\tPreco\n");
for(i=0; i<total; i++){
if(strcmp(zerokm[i].carro, " ")>0){
fprintf(fp2, "%d\t%d\t%s\t\t%.2f\n", zerokm[i].anomod, zerokm[i].cod, zerokm[i].carro, zerokm[i].preco);
}
}
printf("Arquivo texto gerado com sucesso!!\nTecle <ENTER> para continuar...");
fclose(fp2);
getchar();
getchar();
system(CLEAR_CMD);
}
}

Será que alguém poderia me ajudar?

E peço desculpas por qualquer incoveniente, sou iniciante em programação em C.

Obrigado! :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu deuss...

Pode passar o código completo pra eu debugar não?

Dar um breakpoint na função seguido de um step e um disassemble /m (pra ver a instrução no endereço que deu erro) vai ajudar,alias tenta fazer isso sozinho.

Att. regreth

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Utilizando os comandos que você forneceu eu obtive o seguinte:

    Breakpoint 1 at 0x402788
    Single stepping until exit from function opcao_nro5, which has no line number information.

    1 [main] trab 4232 exception::handle: Exception: STATUS_ACCESS_VIOLATION

    720 [main] trab 4232 open_stackdumpfile: Dumping stack trace to trab.exe.stackdump

    E procurando o endereço de memória que o breakpoint acusa:

    0x00402788 <opcao_nro5+479>: mov %ecx,(%eax)

    Isso ajuda em algo?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Ter passado a linha ou pelo menos o contexto da instrução ajudaria.

    Veja o seguinte programa com problemas e minha depuração da segfault:


    #include <stdio.h>

    void exemplo()
    {
    int *ptr = NULL;
    puts("Oi mundo!");
    puts("Hehe");
    *ptr = 10;
    }

    int main()
    {
    exemplo();
    return 0;
    }

    Compilo com as flags de depuração,dai abro o programa no gdb e rodo:


    (gdb) r
    Starting program: /home/rebirth/teste
    Oi mundo!
    Hehe

    Program received signal SIGSEGV, Segmentation fault.
    0x0804840c in exemplo () at teste.c:8
    8 *ptr = 10;
    (gdb) bt
    #0 0x0804840c in exemplo () at teste.c:8
    #1 0x0804841f in main () at teste.c:13
    (gdb) l
    3 void exemplo()
    4 {
    5 int *ptr = NULL;
    6 puts("Oi mundo!");
    7 puts("Hehe");
    8 *ptr = 10;
    9 }
    10
    11 int main()
    12 {
    (gdb) l 11,13
    11 int main()
    12 {
    13 exemplo();
    (gdb) break 13
    Breakpoint 1 at 0x804841a: file teste.c, line 13.
    (gdb) r
    The program being debugged has been started already.
    Start it from the beginning? (y or n) y
    Starting program: /home/rebirth/teste

    Breakpoint 1, main () at teste.c:13
    13 exemplo();
    (gdb) step
    exemplo () at teste.c:5
    5 int *ptr = NULL;
    (gdb) disassemble /m
    Dump of assembler code for function exemplo:
    4 {
    0x080483e4 <+0>: push %ebp
    0x080483e5 <+1>: mov %esp,%ebp
    0x080483e7 <+3>: sub $0x28,%esp

    5 int *ptr = NULL;
    => 0x080483ea <+6>: movl $0x0,-0xc(%ebp)

    6 puts("Oi mundo!");
    0x080483f1 <+13>: movl $0x80484f0,(%esp)
    0x080483f8 <+20>: call 0x8048318 <puts@plt>

    7 puts("Hehe");
    0x080483fd <+25>: movl $0x80484fa,(%esp)
    0x08048404 <+32>: call 0x8048318 <puts@plt>

    8 *ptr = 10;
    0x08048409 <+37>: mov -0xc(%ebp),%eax
    0x0804840c <+40>: movl $0xa,(%eax)

    9 }
    0x08048412 <+46>: leave

    Baseado nas informações do backtrace que eu dei,sei que o endereço que está dando problema é o 0x0804840c que é relativo a expressão em C *ptr = 10.Dai baseado no tipo de erro,sei que esse ponteiro é inválido e corrigo o erro.No caso,a análise em assembly me leva ao mesmo resultado,só que com mais trabalho.

    Tenta reproduzir,se não conseguir simplesmente me manda o programa.

    Isso claro se o gdb de cara não me der a linha e etc do erro.

    Edit:

    Se eu não tivesse as flags de depuração por exemplo:


    (gdb) r
    Starting program: /home/rebirth/teste
    Oi mundo!
    Hehe

    Program received signal SIGSEGV, Segmentation fault.
    0x0804840c in exemplo ()
    (gdb) bt
    #0 0x0804840c in exemplo ()
    #1 0x0804841f in main ()
    (gdb) break *0x0804840c
    Breakpoint 1 at 0x804840c
    (gdb) r
    The program being debugged has been started already.
    Start it from the beginning? (y or n) y
    Starting program: /home/rebirth/teste
    Oi mundo!
    Hehe

    Breakpoint 1, 0x0804840c in exemplo ()
    (gdb) step
    Single stepping until exit from function exemplo,
    which has no line number information.

    Program received signal SIGSEGV, Segmentation fault.
    0x0804840c in exemplo ()
    (gdb) disassemble /m
    Dump of assembler code for function exemplo:
    0x080483e4 <+0>: push %ebp
    0x080483e5 <+1>: mov %esp,%ebp
    0x080483e7 <+3>: sub $0x28,%esp
    0x080483ea <+6>: movl $0x0,-0xc(%ebp)
    0x080483f1 <+13>: movl $0x80484f0,(%esp)
    0x080483f8 <+20>: call 0x8048318 <puts@plt>
    0x080483fd <+25>: movl $0x80484fa,(%esp)
    0x08048404 <+32>: call 0x8048318 <puts@plt>
    0x08048409 <+37>: mov -0xc(%ebp),%eax
    => 0x0804840c <+40>: movl $0xa,(%eax)
    0x08048412 <+46>: leave
    0x08048413 <+47>: ret
    End of assembler dump.

    Eu saberia por esse código em assembly a mesma coisa.

    Att. regreth

    Editado por regreth

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário

    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×