Ir ao conteúdo
  • Cadastre-se

Segmentation fault (core dumped)


Ryoo

Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

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?

Link para o comentário
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

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!