【问题标题】:Segfault during fclose() despite correct file pointer尽管文件指针正确,但 fclose() 期间的段错误
【发布时间】:2018-07-31 03:42:49
【问题描述】:
  • 在对象销毁期间持续发生;
  • fopen() 之后和 fclose() 之前的文件指针值相同;
  • fclose() 在对象析构函数中只调用一次;
  • 对象是静态创建的,在作用域结束时销毁
  • 文件只在一个线程中处理

文件打开:

logOutFile_fd = fopen(logOutFile,"w");
if (logOutFile_fd==NULL) {
  /* omitted */
}

文件关闭:

if (logOutFile_fd!=NULL) {
  fflush(logOutFile_fd);
  fclose(logOutFile_fd);
}

我用“-g3”编译并运行gdb,这是完整的回溯:

#0  0x00007ffff6f8d3f8 in raise () from /lib64/libc.so.6
No symbol table info available.
#1  0x00007ffff6f8effa in abort () from /lib64/libc.so.6
No symbol table info available.
#2  0x00007ffff6fcf6f9 in __libc_message () from /lib64/libc.so.6
No symbol table info available.
#3  0x00007ffff6fd7f4a in _int_free () from /lib64/libc.so.6
No symbol table info available.
#4  0x00007ffff6fdbc1c in free () from /lib64/libc.so.6
No symbol table info available.
#5  0x00007ffff6fc52c3 in fclose@@GLIBC_2.2.5 () from /lib64/libc.so.6
No symbol table info available.
#6  0x0000000000402733 in t_netInterface::~t_netInterface (this=0x7ffff5f50cf0, __in_chrg=<optimized out>) at connect.cpp:59
No locals.
#7  0x00000000004022fc in pthreadTask (pthData=0x7fffffffe070) at client.cpp:131
        netInterface = {id = 162, currTime = {tv_sec = 0, tv_usec = 0}, dbg_time_sync = {tv_sec = 0, tv_usec = 0}, dbg_time_prev = 0, dbg_time_now = 0, 
          dbg_time_dprev = 0, dbg_time_dnow = 0, dbg_ch0_len = 0, datems = 0, timeMarkSet = {0 <repeats 12 times>}, chunk = 0, chunk_ch = 0 '\000', 
          chunk_dt = 0, chunk_H = 0 '\000', chunk_L = 0 '\000', fpd = 0x0, logOutFile = 0x0, logOutFile_fd = 0x7fffec038f30, 
          dataOutFile = 0x7fffec001c10 "(\b", dataOutFile_fd = 0x7fffec03a580, globalLogFile_fd = 0x7fffec0009d0, dir0 = 0x7fffec001d20 "(\b", sockfd = 11, 
          portno = 34000, serv_addr = {sin_family = 2, sin_port = 53380, sin_addr = {s_addr = 2717952192}, sin_zero = "\000\000\000\000\000\000\000"}, 
          poll_d = {{fd = 11, events = 1, revents = 0}}, f_ret = 0, channelBuffers = 0x7fffec000920, channelBuffIter = 0x7fffec0008e0, 
          channelDataTypeH = 1284, valSigned = 0, dbgFlag = 0, dataPath = 0x7fffec006d50 "(\b", addr_str = 0x7fffec002530 "192.168.0.162", 
          buffChar = 0x7fffec002d40 "(\b", wasConnected = 0}
        data = 0x7fffffffe070
        out_buffer = 64
        in_buffer = {0 <repeats 8192 times>}
        pid = 162
        tid = 162
        logOutFile_fd = 0x7fffec038f30
        res = 1
        rcvDataSizeBytes = 0
        retv = 0
        cc = 2003
        active = 0
        uptimeSec = 27134
        globalLogName = 0x7fffec0008c0 "x"
        globalLogFile_fd = 0x7fffec0009d0
#8  0x00007ffff7328684 in start_thread () from /lib64/libpthread.so.0
No symbol table info available.
#9  0x00007ffff705eefd in clone () from /lib64/libc.so.6
No symbol table info available.

我做错了什么?提前致谢。

编辑:我尝试过重新分配释放器,现在它看起来确实像是在类构造函数和析构函数之间的某个地方造成了内存垃圾。我将重新实现一些东西,所以这个问题可以被认为是关闭的。无论如何,感谢您的宝贵时间。

【问题讨论】:

  • 一般来说,由于指令指针rip 已经增加,所以在发生段错误之后 行会报告段错误。如果没有您调用的函数的来源,我们不知道是什么原因造成的。请发布您的代码。
  • 请将您的程序缩减为能够说明问题的最短完整程序。请将整个短程序复制粘贴到您的问题中。请参阅minimal reproducible example 了解更多信息。
  • 在对象销毁期间持续发生 什么对象?请发帖minimal reproducible example
  • 这是一个多线程应用程序吗? t_NetInterface是如何构造和销毁的?

标签: c++ linux gcc memory segmentation-fault


【解决方案1】:

像这样的 fclose 崩溃表明所涉及的FILE 数据结构已损坏,可能是由于程序中其他地方使用了无效指针。

你最好的选择可能是像valgrind这样的内存检查工具

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 2012-11-29
    • 1970-01-01
    • 2011-02-06
    相关资源
    最近更新 更多