【问题标题】:Segmentation fault on closing a binary file关闭二进制文件时出现分段错误
【发布时间】:2011-11-04 00:10:45
【问题描述】:

下面给出了导致分段错误的代码部分。

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位被设置。使用valgrind 发现我的整个程序没有内存泄漏。

对另一个二进制文件重复相同的代码(如上),并且在关闭该文件(该文件已提前关闭)时不会出现分段错误,即使该文件也同时设置了失败和 eof 位。

使用gdb和core文件识别文件关闭导致分段错误,如下所示。

#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()被调用并发生了分段违规。

在什么情况下关闭文件会造成 seg 违规?

关于如何进一步调查/修复它的任何想法?

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

放心

【问题讨论】:

  • 试试copy(xi_in, ii_t&lt;uint&gt;(), xi.data());。还要确保收件人已经足够大。
  • 你能否提供一个最小的可编译示例来演示该问题。
  • @KerrekSB 是的,它只是 ii_t - 这是错字。谢谢
  • @LokiAstari 在尝试创建一个最小示例时,我看到分段错误来自 boost::multi_array。所以我创建了一个最小的示例并将其作为一个新问题发布在这里:stackoverflow.com/questions/8004456/…
  • @LokiAstari 我删除了 ii_t 类,而是从二进制文件读取到向量,然后填充了 boost 多数组,一切正常...我可以将我的代码和文件发送给你如果需要,会创建此段错误。我也很好奇为什么会这样。

标签: c++ segmentation-fault binaryfiles


【解决方案1】:

解决方案在 cmets 中已经提到,但为了方便以后的读者,将其作为答案单独发布。

问题出在ii_t 类上,Segmentation fault on boost::multi_array 中提供了解决方案 https://stackoverflow.com/users/12711/michael-burr

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2019-05-14
    相关资源
    最近更新 更多