2010-02-25 33 views
14

Tôi có đoạn mã này trong đó tôi đang mở/đóng một tập tin một số lần (trong một vòng lặp):Tại sao tôi có một SIGABRT ở đây?

for(i=1;i<max;i++) 
    { 
     /* other code */ 
     plot_file=fopen("all_fitness.out","w"); 
     for (j=0;j<pop_size;j++) 
     fprintf(plot_file, "%lf %lf\n",oldpop[i].xreal[0],oldpop[i].obj); 
     fclose(plot_file); 
     /*other code*/ 
    } 

tôi nhận được một SIGABRT ở đây, với những vết lùi sau:

#0 0x001fc422 in __kernel_vsyscall() 
#1 0x002274d1 in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 
#2 0x0022a932 in *__GI_abort() at abort.c:92 
#3 0x0025dee5 in __libc_message (do_abort=2, fmt=0x321578 "*** glibc detected *** %s: %s: 0x%s ***\n") 
    at ../sysdeps/unix/sysv/linux/libc_fatal.c:189 
#4 0x00267ff1 in malloc_printerr (action=<value optimized out>, str=0x6 <Address 0x6 out of bounds>, ptr=0x8055a60) at malloc.c:6217 
#5 0x002696f2 in _int_free (av=<value optimized out>, p=<value optimized out>) at malloc.c:4750 
#6 0x0026c7cd in *__GI___libc_free (mem=0x8055a60) at malloc.c:3716 
#7 0x0025850a in _IO_new_fclose (fp=0x8055a60) at iofclose.c:88 
#8 0x0804b9c0 in main() at ga.c:1100 

Dòng số 1100, là dòng nơi tôi đang làm fclose() trong đoạn mã trên. Lý do của hành vi trên là gì? Bất kỳ con trỏ nào được đánh giá cao.

(Tôi đang trên Linux và sử dụng gcc)

+1

Bạn đang sử dụng cùng một i trong cả hai vòng của bạn, có chủ ý không? – IVlad

+0

@IVlad: Cảm ơn bạn đã chỉ ra. Đó là một lỗi trong việc đăng câu hỏi. Sửa lỗi. –

+0

Có gì với thông điệp malloc_printerr? Bạn có chắc chắn fclose() đang gây ra sự cố không? Tôi nghĩ rằng bạn nên giảm mã của bạn để chính xác một phần gây ra vấn đề và đăng ... – IVlad

Trả lời

14

Khi bạn gọi fclose(), glibc sẽ giải phóng một số cấu trúc được phân bổ động; bên trong có một cuộc gọi free(). malloc()free() dựa trên các cấu trúc phức tạp, được xây dựng động. Rõ ràng, glibc thấy rằng các cấu trúc ở trạng thái không mạch lạc, đến mức không thể giải phóng bộ nhớ an toàn. glibc quyết định rằng vấn đề là nghiêm trọng, đủ để đảm bảo hủy bỏ ngay lập tức.

Điều này có nghĩa là bạn có lỗi ở đâu đó trong mã, có thể khá xa đoạn trích bạn hiển thị, tràn bộ đệm hoặc ghi bộ nhớ ngoài vùng tương tự làm hỏng cấu trúc phân bổ bộ nhớ.

Bạn có thể muốn thử Valgrind hoặc Electric Fence để sắp xếp các sự cố như vậy.

+0

Xin chào Thomas: Vâng, lỗi ở đâu đó khác. Valgrind đã giúp tôi tìm ra nó. Vì vậy, cảm ơn cho gợi ý của bạn. Sau khi câu trả lời của bạn, tôi thực sự đào sâu vào mã, và đã sửa chữa một sai lầm khá ngu ngốc, bị bỏ qua. –

1

Tôi không biết nếu nó gây ra vấn đề cụ thể của bạn, nhưng bạn nên luôn luôn kiểm tra con trỏ FILE * trả về bởi fopen() trong trường hợp đó là NULL.

+0

Tôi đã đặt một kiểm tra, không có gì tanh. Cảm ơn :) –

Các vấn đề liên quan