Ошибка сегментации при закрытии двоичного файла - PullRequest
0 голосов
/ 04 ноября 2011

Часть кода, которая вызывает ошибку сегментации, приведена ниже.

ifstream xiFileId(xifile, ios::binary); //xifile is a char * 

//the ii_t class in the following line is taken from /1331861/c-dvoichnyi-fail-vvoda-vyvoda-v-iz-konteinerov-krome-char-s-ispolzovaniem-algoritmov-stl written by http://stackoverflow.com/users/14065/loki-astari

ii_t<uint> xi_in(xiFileId);
copy(xi_in, ii_t<uint>(), xi.data()); //xi is a 2D boost::multi_array 

//my efforts to debug

ios::iostate s = xiFileId.rdstate();

if(s & ios::badbit) cout << "bad bit is set" << endl;
if (s & ios::failbit) cout << "fail bit is set" << endl;
if (s & ios::eofbit) cout << "eof bit is set" << endl;
if (s & ios::goodbit) cout << "good bit is set" << endl;

xiFileId.close(); //this line creates the seg violation

Обнаружено, что установлены биты failbit и eof.Используя valgrind, было обнаружено, что утечки памяти для всей моей программы нет.

Тот же код (как выше) повторяется для другого двоичного файла, и при закрытии этого файла (этот файл был закрыт ранее) ошибка сегментации не возникает, даже если в этом файле также установлены как сбой, так и бит eof.

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

#0  0x00007f16ad99ae50 in __libc_free (mem=0x1b8f930) at malloc.c:3724
3724    malloc.c: No such file or directory.
in malloc.c
(gdb) bt
#0  0x00007f16ad99ae50 in __libc_free (mem=0x1b8f930) at malloc.c:3724
#1  0x00007f16ae1adf0e in std::basic_filebuf<char, std::char_traits<char>   >::_M_destroy_internal_buffer() () from /usr/lib/libstdc++.so.6

#2  0x00007f16ae1af4d4 in std::basic_filebuf<char, std::char_traits<char> >::close() () from /usr/lib/libstdc++.so.6
#3  0x00007f16ae1b133d in std::basic_ifstream<char, std::char_traits<char> >::close() () from /usr/lib/libstdc++.so.6
#4  0x000000000040c119 in main (argc=19, argv=0x7fff05849898) at prediction.cpp:161

Если я удаляю xiFileId.close();, так как компилятор закроетсяКогда файл выходит из области видимости, обратная трассировка GDB дает следующее:

#0  0x00007f97fab81e50 in __libc_free (mem=0x15a7930) at malloc.c:3724
3724    malloc.c: No such file or directory.
in malloc.c
(gdb) bt
#0  0x00007f97fab81e50 in __libc_free (mem=0x15a7930) at malloc.c:3724
#1  0x00007f97fb394f0e in std::basic_filebuf<char, std::char_traits<char> >::_M_destroy_internal_buffer() () from /usr/lib/libstdc++.so.6
#2  0x00007f97fb3964d4 in std::basic_filebuf<char, std::char_traits<char> >::close() () from /usr/lib/libstdc++.so.6
#3  0x00007f97fb39c966 in std::basic_ifstream<char, std::char_traits<char> >::~basic_ifstream() () from /usr/lib/libstdc++.so.6
#4  0x000000000040c184 in main (argc=19, argv=0x7fff59b71918) at prediction.cpp:163

, который показывает, что вызывается ~basic_ifstream() и происходит нарушение сегментации.

При каких условияхЗакрытие файла может привести к нарушению сегмента?

Есть идеи, как мне продолжить расследование / исправить это?

Этот код запускается в Ubuntu 10.04 и компилируется с использованием gcc версии 4.4.3.

суреш

1 Ответ

1 голос
/ 04 ноября 2011

Решение уже упоминалось в комментариях, но для удобства будущих читателей оно публикуется как ответ отдельно.

Проблема была с классом ii_t, и решение было предоставлено в Ошибка сегментации при форсировании :: multi_array by https://stackoverflow.com/users/12711/michael-burr

...