__memcpy_ssse3() 分段错误

问题描述 投票:0回答:3

我正在使用 Opencv,尝试复制从网络摄像头捕获的一些帧。复制帧时,我在第 160 或 1675 行

__memcpy_ssse3()
中遇到分段错误。

gdb 显示:

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

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

2 0xb75984f6 在 cv::Mat::Mat (这=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。

有什么提示吗?

c++ opencv segmentation-fault
3个回答
10
投票

SSE 操作中的分段错误是由于内存未对齐造成的。尝试传递

-mpreferred-stack-boundary=4 -mstackrealign
看看是否可以解决问题。如果是这样,那么您需要检查堆栈以找出哪些代码未对齐。


5
投票

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


0
投票

由于这个问题帮助我在自己的代码中找到了一个错误,该错误与不正确的锁定略有不同,所以我想在这里添加评论。

也许这个示例将是一个提示,并帮助尝试理解互斥体和 std::string 如何与陷入分段错误相关的人。

在我的代码中,我有正确的锁定,但情况略有不同,破坏顺序和锁定一起产生了错误

  • 一个线程正在执行对象的析构函数,并且已经执行该对象的基类析构函数。 基类提供了注册/取消注册处理程序(在构造/销毁时)的服务,该服务受互斥体保护。执行正在等待互斥体
  • 获取互斥锁的另一个线程尝试分派给处理程序。这导致了对派生类成员 std::string 的访问,因此 __memmove_ssse3 上出现分段错误,因为这些成员已被另一个线程销毁。

解决方案是在继续销毁之前从基类取消注册处理程序。

© www.soinside.com 2019 - 2024. All rights reserved.