但这个完全不同!如果我注释掉std::flush
行,则发生Segfault,但如果我添加此行,则不会发生分段错误!
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_INDEX
和stm_buf_t[]
,还可以。还;如果我从另一个地方拨打std::cout << std::flush;
,这个地方有这个功能,它也会处理Segfault!
...
genSum ( stm_buf_t );
writeToSerial();
std::cout << std::flush;
...
我的下一步方法是什么?
答案 0 :(得分:4)
经验丰富的书呆子会注意到堆栈中充满了ASCII。这几乎总是在本地变量的strcpy或类似的缓冲区溢出的迹象。
我将一些堆栈地址从十六进制转换为ASCII。它似乎向后看。
rorre dedeecxe rorre dlohserht.0:yb d,257741it elcyc61.0:em,1496762ohserht 20.0:dlt daer,1.0:emi50340523etadpu,0:emit
第一位似乎表示&#39;阈值错误超出错误&#39;。在您的代码或输入文件中查找此文本,并查看代码中的使用位置。几乎肯定会有一个覆盖本地缓冲区的内存副本。
正如评论所指出的,Valgrind经常会发现这类问题。