关闭二进制文件时出现分段错误
下面给出了引起分段错误的代码部分。
ifstream xiFileId(xifile, ios::binary); //xifile is a char *
//the ii_t class in the following line is taken from http://stackoverflow.com/questions/1855704/c-binary-file-i-o-to-from-containers-other-than-char-using-stl-algorithms 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 编译。
苏雷什
The part of the code which gives rise to the segmentation fault is given below.
ifstream xiFileId(xifile, ios::binary); //xifile is a char *
//the ii_t class in the following line is taken from http://stackoverflow.com/questions/1855704/c-binary-file-i-o-to-from-containers-other-than-char-using-stl-algorithms 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
It is found that the failbit
and eof
bit are set. Using valgrind
it was found that there is no memory leak for my whole program.
The same code (as above) is repeated for another binary file and a segmentation fault does not arise when closing that file (that file is closed earlier) even though that file also has both fail and eof bit set.
That file closing give rise to segmentation fault is identified by using gdb and the core file, which is given below.
#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
If I remove the xiFileId.close();
as the compiler will close the file when it becomes out of scope, the gdb back trace gives the following:
#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
which shows that the ~basic_ifstream()
is called and segmentation violation occurs.
Under what conditions a file closing can create a seg violation?
Any ideas on how can I investigate further/fix it?
This code is run on Ubuntu 10.04 and compiled using gcc version 4.4.3 .
suresh
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
评论中已经提到了解决方案,但为了方便以后的读者,将其作为答案单独发布。
问题出在 ii_t 类上,boost::multi_array 出现分段错误
通过 https://stackoverflow.com/users/12711/michael-burr
The solution is already mentioned in the comments but for the convenience of future readers, it is posted as an answer seperately.
The problem was with the
ii_t
class and a solution was provided in Segmentation fault on boost::multi_arrayby https://stackoverflow.com/users/12711/michael-burr