【问题标题】:Segmentation Fault occurs if no std::flush如果没有 std::flush 则发生分段错误
【发布时间】:2017-01-15 23:33:05
【问题描述】:

已经有一些方法可以解决这个问题。 ¹² ³

但是这个完全不同!如果我注释掉std::flush 行,就会发生Segfault,但是如果我添加这行,就不会发生Segmentation fault!

int Stm32Serial::writeToSerial()
{
    /// TODO Write handle for writing if necessary
    /// int serial_write_ret;
    if ( USE_USB )
    {
        usb_port.writeBytes ( stm_buf_t, stm_buf_t[LENGTH_INDEX] );
        return SERIAL_RET;
    }
    else
    {
        std::cout << std::flush; // TODO HACK Remove it!
        serial_port.sendBuff ( stm_buf_t, stm_buf_t[LENGTH_INDEX] );
        return SERIAL_RET;
    }
}

我也试过gdb;我在ROS 中使用此函数,使用this 调试技术和compiling with -g option,但它不打印函数名称

Program received signal SIGSEGV, Segmentation fault.
__mempcpy_sse2 () at ../sysdeps/x86_64/memcpy.S:142
142 ../sysdeps/x86_64/memcpy.S: No such file or directory.
(gdb) bt
#0  __mempcpy_sse2 () at ../sysdeps/x86_64/memcpy.S:142
#1  0x6564656563786520 in ?? ()
#2  0x20726f7272652064 in ?? ()
#3  0x6c6f687365726874 in ?? ()
#4  0x2e30203a79622064 in ?? ()
#5  0x202c323537373431 in ?? ()
#6  0x697420656c637963 in ?? ()
#7  0x36312e30203a656d in ?? ()
#8  0x2c31343936373632 in ?? ()
#9  0x6f68736572687420 in ?? ()
#10 0x32302e30203a646c in ?? ()
#11 0x742064616572202c in ?? ()
#12 0x312e30203a656d69 in ?? ()
#13 0x3530333430353233 in ?? ()
#14 0x657461647075202c in ?? ()
#15 0x30203a656d697420 in ?? ()
#16 0x373430353233312e in ?? ()
#17 0x74697277202c3234 in ?? ()
#18 0x203a656d69742065 in ?? ()
#19 0x3637363236312e30 in ?? ()
#20 0x006d305b1b333637 in ?? ()
#21 0x00007fffffffbbf0 in ?? ()
#22 0x00000000ffffbbd8 in ?? ()
---Type <return> to continue, or q <return> to quit---
#23 0x00007fff00000000 in ?? ()
#24 0x0000000000000000 in ?? ()
(gdb) 
  • 找了LENGTH_INDEXstm_buf_t[],有ok。

还有;如果我从另一个地方调用std::cout &lt;&lt; std::flush;,它调用了这个函数,它也会处理Segfault!

...
genSum ( stm_buf_t );
writeToSerial();
std::cout << std::flush;
...

我的下一个方法是什么?

【问题讨论】:

  • 嗨@Orhan G. Hafif,您是否尝试过使用内存调试器(例如valgrind)?
  • 嗨@vadikrobot,我刚刚尝试并看到了一些有价值的输出。我稍后会写。谢谢!我

标签: c++ segmentation-fault flush ros endl


【解决方案1】:

有经验的书呆子会注意到堆栈中充满了 ASCII。这几乎总是一个 strcpy 或类似局部变量中的缓冲区溢出的标志。

我将一些堆栈地址从十六进制转换为 ASCII。它似乎是倒着读的。

rorre dedeecxe rorre dlohserht.0 :yb d ,257741it elcyc61.0 :em,1496762ohserht 20.0 :dlt daer ,1.0 :emi50340523etadpu ,0 :emit

第一位似乎说“阈值错误超出错误”。在您的代码或输入文件中查找此文本,并查看它在代码中的使用位置。几乎可以肯定有一个内存副本正在覆盖本地缓冲区。

正如评论所述,Valgrind 经常会发现这类问题。

【讨论】:

    猜你喜欢
    • 2014-04-07
    • 2013-03-25
    • 2017-05-05
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多