我正在使用Opencv,尝试复制从网络摄像头捕获的一些帧。复制帧时,我在__memcpy_ssse3()
,第160或1675行中遇到分段错误。
gdb显示:
0 __memmove_ssse3()at ../ sysdeps / I386 / i686的/ multiarch / memcpy的-ssse3.S:1675
1 0xb75ec6d0在cv :: Mat :: copyTo(this = 0xbfca3450,_dst = ...)at at /home/david/opencv/OpenCV-2.4.2/modules/core/src/copy.cpp:181
cv :: Mat :: Mat中的2 0xb75984f6(这= 0xbfca358c,img = 0xb1300c90, copyData = true)at /home/david/opencv/OpenCV-2.4.2/modules/core/src/matrix.cpp:510
调用它的函数是cv::MAt::Mat(IplImg *I, bool copy)
。
当我打开USB摄像头或文件时,一切都很完美,但是当尝试通过IP从网络摄像头读取视频流时,它会在一分钟后崩溃。
我尝试在没有ssse3支持的情况下构建ffmpeg和opencv,并且我的应用程序也使用-mno-seee3
标志编译。
Opencv vesion是2.4.2,但问题也存在于2.3.1中。 ffmpeg版本是11.1,在8.X中也是同样的问题。 gcc版本是4.6.3,Ubuntu的分支。 处理器是Intel core2。
任何提示?
答案 0 :(得分:4)
SSE操作中的分段错误是由于内存未对齐造成的。尝试传递-mpreferred-stack-boundary=4 -mstackrealign
以查看是否将其清除。如果确实如此,那么您需要检查堆栈以找出哪些代码未对齐。
答案 1 :(得分:1)
谢谢大家,解决了。 线程之间的锁定存在错误,并且在某种程度上内存被覆盖或在其他线程中释放。在修复了锁定依赖关系之后,segfault的问题就解决了。