关闭二进制文件时出现分段错误 [英] Segmentation fault on closing a binary file

查看:91
本文介绍了关闭二进制文件时出现分段错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

引起分段错误的代码部分如下.

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

发现failbiteof位置1.使用valgrind,发现整个程序没有内存泄漏.

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.

对于另一个二进制文件,重复相同的代码(如上所述),并且即使该文件同时设置了fail和eof位,在关闭该文件(该文件更早关闭)时也不会出现分段错误.

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.

通过使用gdb和核心文件(如下所示)来确定文件关闭会导致分段错误.

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

如果我删除了xiFileId.close();,因为编译器将在文件超出范围时将其关闭,则gdb向后跟踪将显示以下内容:

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

表明~basic_ifstream()被调用并且发生了分段违规.

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?

此代码在Ubuntu 10.04上运行,并使用gcc版本4.4.3进行编译.

This code is run on Ubuntu 10.04 and compiled using gcc version 4.4.3 .

suresh

推荐答案

该解决方案已在注释中提及,但为将来读者方便起见,将其单独发布为答案.

The solution is already mentioned in the comments but for the convenience of future readers, it is posted as an answer seperately.

问题出在ii_t类上,并​​且在中提供了解决方案boost :: multi_array 上的细分错误 通过 https://stackoverflow.com/users/12711/michael-burr

The problem was with the ii_t class and a solution was provided in Segmentation fault on boost::multi_array by https://stackoverflow.com/users/12711/michael-burr

这篇关于关闭二进制文件时出现分段错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆