Почему я получаю SIGABRT здесь?

У меня есть этот сегмент кода, в котором я открываюсь/закрываю файл неоднократно (в цикле):

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*/
     }

Я получаю SIGABRT здесь со следующим следом:

#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

Номер строки 1100, строка, где я делаю fclose() в вышеупомянутом сегменте кода. Какова причина вышеупомянутого поведения? Любые указатели ценятся.

(Я нахожусь на Linux и использующий gcc),

16
задан 25 February 2010 в 13:47
поделиться

2 ответа

No. Это подсистема графического интерфейса Windows. В WinAPI есть функции для работы с консолью: http://msdn.microsoft.com/en-us/library/ms682073% 28VS.85% 29.aspx

-121--3357674-

Консоль (ОС) представляет собой процесс (содержащий один или несколько потоков выполнения, все из которых совместно используют одно и то же пространство памяти), и этот процесс имеет:

  • стандартный вход (поток входных байтов), то, что вы выбираете в стандартном выходе
  • (поток выходных байтов), что программа печатает
  • стандартная ошибка (поток выходных байтов), что программа печатает, когда она жалуется на что-то

Поэтому, если вы хотите создать другую консоль (из .Net) и связать входные/выходные данные, как я понимаю, необходимо создать процесс (выполнение «cmd.exe» на примере).

Я не знаю API .Net для манипулирования процессами, но если это как Java, вы можете подключить stdin, out и err, чтобы вы могли играть с созданным процессом из исходного.

-121--3357675-

При вызове fclose () glibc освобождает некоторые динамически выделенные структуры; внутренний вызов free () . malloc () и free () основаны на довольно сложных, динамически построенных структурах. Судя по всему, glibc обнаружил, что структуры находились в некогерентном состоянии, к точке, что безопасного освобождения памяти сделать нельзя. glibc решил, что проблема достаточно серьезна, чтобы гарантировать немедленный отказ.

Это означает, что у вас есть ошибка где-то в вашем коде, возможно, довольно далеко от фрагмента, который вы показываете, переполнение буфера или подобная запись вне места памяти, которая повреждает структуры выделения памяти.

Вы можете попытаться Valgrind или Electric Fence решить такие проблемы.

18
ответ дан 30 November 2019 в 22:24
поделиться

Я не знаю, вызывает ли он вашу конкретную проблему, но вы всегда должны проверять указатель FILE * , возвращаемый функцией fopen () , если он NULL .

1
ответ дан 30 November 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: