__memcpy_ssse3() 分段错误

Posted

技术标签:

【中文标题】__memcpy_ssse3() 分段错误【英文标题】:__memcpy_ssse3() segmentation fault 【发布时间】:2012-07-16 15:39:48 【问题描述】:

我正在使用 Opencv,试图复制从网络摄像头捕获的一些帧。复制帧时,我在__memcpy_ssse3(),第 160 或 1675 行遇到分段错误。

gdb 显示:

0 __memmove_ssse3 () 在 ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S:1675

1 0xb75ec6d0 在 cv::Mat::copyTo (this=0xbfca3450, _dst=...) at /home/david/opencv/OpenCV-2.4.2/modules/core/src/copy.cpp:181

2 0xb75984f6 in cv::Mat::Mat (this=0xbfca358c, img=0xb1300c90, 复制数据=真)在 /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 版本是 2.4.2,但是 2.3.1 也存在问题。 ffmpeg 版本是 11.1,在 8.X 中同样的问题。 gcc 版本是 4.6.3,Ubuntu 的分支。 处理器为 Intel core2。

有什么提示吗?

【问题讨论】:

-mno-seee3 谢谢,这不是错字。这是man gcc建议的标志。 @David:这是一个错字。此外,它在 sse 上崩溃的事实只是一些实现细节,错误是在此之上的一些层。 哎呀,这是一个错字......但在我的 Makefile 中没关系。您可能对问题出在上面的某个地方是正确的,但我不明白在哪里。如果它是我的应用程序中的错误,它可能应该被 Opencv 捕获;但也许不是。你有什么想法如何尝试调试它? IplImg 指针不为 NULL,但是有什么方法可以验证 IplImg 结构本身吗?谢谢。 会不会是内存对齐不正确?这是 SSE 相关段错误的最常见原因。 【参考方案1】:

SSE 操作中的分段错误是由于内存未对齐造成的。尝试传递-mpreferred-stack-boundary=4 -mstackrealign 看看是否可以清除它。如果确实如此,那么您需要检查您的堆栈以找出哪些代码未对齐它。

【讨论】:

谢谢 Ecatmur。不幸的是,它对我不起作用。我用这些标志重建了 Opencv 和我的程序,但仍然在同一件事上崩溃。但是我学到了一些东西,非常感谢。【参考方案2】:

谢谢大家,解决了。 线程之间的锁定出现错误,并且不知何故,内存在其他线程中被覆盖或释放。修复锁依赖后,段错误的问题解决了。

【讨论】:

我可以确认,我身边也有类似的情况。释放内存操作,即释放变量的随机值是这样的,导致此错误。

以上是关于__memcpy_ssse3() 分段错误的主要内容,如果未能解决你的问题,请参考以下文章

当我调用jmp时,我在c内联汇编中出现了段错误

运行 zend_hash_find() 时出现分段错误

使用 CUDA 流时的段错误

全局写入时出现分段错误

在 C++ 中使用向量时出现分段错误

SSE _mm_store_ps 分段错误问题