c++ - 在网络 URL 上调用函数 cvCreateFileCapture 时有时会出现段错误

标签 c++ opencv

有时使用网络 URL 作为参数调用函数 cvCreateFileCapture 时,会发生段错误,例如:rtsp://IPaddress:Port/Path...

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    ...

    CvCapture* capture = cvCreateFileCapture("rtsp://...");

    ...

    return a.exec();
}

如果参数是磁盘上的文件,则不会发生错误。

我在 Debug模式下构建源代码,当发生段错误时,会列出以下堆栈跟踪:

gst_caps_unref
CvCapture_GStreamer::open(int, char const*)
cvCreateCapture_GStreamer(int, char const*)
cvCreateFileCapture
main

更新。如果我创建一个纯 C++ 项目,对函数 cvCreateFileCapture 的调用始终会导致段错误。相反,如果我创建一个 Qt Gui Application 项目,则段错误会随机发生。

VALGRIND 的输出

==3160== Memcheck, a memory error detector
==3160== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==3160== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==3160== Command: ./Calibration 15 8 5 http://root:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="562439392216676f647867606e7867786367" rel="noreferrer noopener nofollow">[email protected]</a>/axis-cgi/mjpg/video.cgi
==3160== 
--3160-- WARNING: Serious error when reading debug info
--3160-- When reading debug info from /usr/lib/nvidia-331/libGL.so.331.20:
--3160-- Can't make sense of .data section mapping
--3160-- WARNING: Serious error when reading debug info
--3160-- When reading debug info from /usr/lib/nvidia-331/libnvidia-glcore.so.331.20:
--3160-- Can't make sense of .got section mapping
==3160== Invalid read of size 4
==3160==    at 0x74444A2: ??? (in /usr/lib/i386-linux-gnu/libfontconfig.so.1.4.4)
==3160==    by 0x7446B09: FcConfigFilename (in /usr/lib/i386-linux-gnu/libfontconfig.so.1.4.4)
==3160==    by 0x745B1EB: FcConfigParseAndLoad (in /usr/lib/i386-linux-gnu/libfontconfig.so.1.4.4)
==3160==    by 0x7450065: FcInitLoadConfig (in /usr/lib/i386-linux-gnu/libfontconfig.so.1.4.4)
==3160==    by 0x7450188: FcInitLoadConfigAndFonts (in /usr/lib/i386-linux-gnu/libfontconfig.so.1.4.4)
==3160==    by 0x745040C: FcInit (in /usr/lib/i386-linux-gnu/libfontconfig.so.1.4.4)
==3160==    by 0x585B608: ??? (in /usr/lib/i386-linux-gnu/libQtGui.so.4.8.1)
==3160==    by 0x57DCC0B: QApplicationPrivate::construct(_XDisplay*, unsigned long, unsigned long) (in /usr/lib/i386-linux-gnu/libQtGui.so.4.8.1)
==3160==    by 0x7E014E7: ???
==3160==  Address 0xaaa898c is 20 bytes inside a block of size 22 alloc'd
==3160==    at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3160==    by 0x7444407: ??? (in /usr/lib/i386-linux-gnu/libfontconfig.so.1.4.4)
==3160==    by 0x7446B09: FcConfigFilename (in /usr/lib/i386-linux-gnu/libfontconfig.so.1.4.4)
==3160==    by 0x745B1EB: FcConfigParseAndLoad (in /usr/lib/i386-linux-gnu/libfontconfig.so.1.4.4)
==3160==    by 0x7450065: FcInitLoadConfig (in /usr/lib/i386-linux-gnu/libfontconfig.so.1.4.4)
==3160==    by 0x7450188: FcInitLoadConfigAndFonts (in /usr/lib/i386-linux-gnu/libfontconfig.so.1.4.4)
==3160==    by 0x745040C: FcInit (in /usr/lib/i386-linux-gnu/libfontconfig.so.1.4.4)
==3160==    by 0x585B608: ??? (in /usr/lib/i386-linux-gnu/libQtGui.so.4.8.1)
==3160==    by 0x57DCC0B: QApplicationPrivate::construct(_XDisplay*, unsigned long, unsigned long) (in /usr/lib/i386-linux-gnu/libQtGui.so.4.8.1)
==3160==    by 0x7E014E7: ???
==3160== 
==3160== 
==3160== ---- Attach to debugger ? --- [Return/N/n/Y/y/C/c] ---- Y
==3160== starting debugger with cmd: /usr/bin/gdb -nw /proc/3163/fd/1024 3163
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /proc/3163/fd/1024...done.
Attaching to program: /proc/3163/fd/1024, process 3163
Reading symbols from /usr/lib/valgrind/vgpreload_core-x86-linux.so...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/valgrind/vgpreload_core-x86-linux.so
Reading symbols from /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so
Reading symbols from /usr/local/lib/libopencv_core.so.2.4...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/libopencv_core.so.2.4
Reading symbols from /usr/local/lib/libopencv_imgproc.so.2.4...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/libopencv_imgproc.so.2.4
Reading symbols from /usr/local/lib/libopencv_highgui.so.2.4...done.
Loaded symbols for /usr/local/lib/libopencv_highgui.so.2.4
Reading symbols from /usr/local/lib/libopencv_calib3d.so.2.4...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/libopencv_calib3d.so.2.4
Reading symbols from /usr/lib/i386-linux-gnu/libQtGui.so.4...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libQtGui.so.4
Reading symbols from /lib/i386-linux-gnu/libpthread.so.0...Reading symbols from /usr/lib/debug/lib/i386-linux-gnu/libpthread-2.15.so...done.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/i386-linux-gnu/libthread_db.so.1".
done.
Loaded symbols for /lib/i386-linux-gnu/libpthread.so.0
Reading symbols from /usr/lib/i386-linux-gnu/libstdc++.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libstdc++.so.6
Reading symbols from /lib/i386-linux-gnu/libgcc_s.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/i386-linux-gnu/libgcc_s.so.1
Reading symbols from /lib/i386-linux-gnu/libc.so.6...Reading symbols from /usr/lib/debug/lib/i386-linux-gnu/libc-2.15.so...done.
done.
Loaded symbols for /lib/i386-linux-gnu/libc.so.6
Reading symbols from /lib/i386-linux-gnu/libz.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/i386-linux-gnu/libz.so.1
Reading symbols from /lib/i386-linux-gnu/librt.so.1...Reading symbols from /usr/lib/debug/lib/i386-linux-gnu/librt-2.15.so...done.
done.
Loaded symbols for /lib/i386-linux-gnu/librt.so.1
Reading symbols from /usr/lib/i386-linux-gnu/libGLU.so.1...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libGLU.so.1
Reading symbols from /usr/lib/nvidia-331/libGL.so.1...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/nvidia-331/libGL.so.1
Reading symbols from /lib/i386-linux-gnu/libm.so.6...Reading symbols from /usr/lib/debug/lib/i386-linux-gnu/libm-2.15.so...done.
done.
Loaded symbols for /lib/i386-linux-gnu/libm.so.6
Reading symbols from /usr/lib/i386-linux-gnu/libjpeg.so.8...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libjpeg.so.8
Reading symbols from /lib/i386-linux-gnu/libpng12.so.0...(no debugging symbols found)...done.
Loaded symbols for /lib/i386-linux-gnu/libpng12.so.0
Reading symbols from /usr/lib/i386-linux-gnu/libtiff.so.4...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libtiff.so.4
Reading symbols from /usr/lib/i386-linux-gnu/libjasper.so.1...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libjasper.so.1
Reading symbols from /usr/lib/libIlmImf.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/libIlmImf.so.6
Reading symbols from /usr/lib/libHalf.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/libHalf.so.6
Reading symbols from /usr/lib/i386-linux-gnu/libgstreamer-0.10.so.0...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libgstreamer-0.10.so.0
Reading symbols from /usr/lib/i386-linux-gnu/libgobject-2.0.so.0...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libgobject-2.0.so.0
Reading symbols from /lib/i386-linux-gnu/libglib-2.0.so.0...(no debugging symbols found)...done.
Loaded symbols for /lib/i386-linux-gnu/libglib-2.0.so.0
Reading symbols from /usr/lib/i386-linux-gnu/libgstapp-0.10.so.0...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libgstapp-0.10.so.0
Reading symbols from /usr/lib/i386-linux-gnu/libgstvideo-0.10.so.0...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libgstvideo-0.10.so.0
Reading symbols from /usr/lib/i386-linux-gnu/libdc1394.so.22...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libdc1394.so.22
Reading symbols from /usr/local/lib/libv4l1.so.0...done.
Loaded symbols for /usr/local/lib/libv4l1.so.0
Reading symbols from /usr/lib/i386-linux-gnu/libxvidcore.so.4...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libxvidcore.so.4
Reading symbols from /usr/lib/i386-linux-gnu/libQtOpenGL.so.4...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libQtOpenGL.so.4
Reading symbols from /usr/lib/i386-linux-gnu/libQtCore.so.4...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libQtCore.so.4
Reading symbols from /usr/lib/i386-linux-gnu/libQtTest.so.4...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libQtTest.so.4
Reading symbols from /usr/lib/i386-linux-gnu/libva.so.1...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libva.so.1
Reading symbols from /usr/lib/i386-linux-gnu/libvorbisenc.so.2...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libvorbisenc.so.2
Reading symbols from /usr/lib/i386-linux-gnu/libvorbis.so.0...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libvorbis.so.0
Reading symbols from /usr/lib/i386-linux-gnu/libtheoraenc.so.1...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libtheoraenc.so.1
Reading symbols from /usr/lib/i386-linux-gnu/libtheoradec.so.1...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libtheoradec.so.1
Reading symbols from /usr/lib/libopencore-amrwb.so.0...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/libopencore-amrwb.so.0
Reading symbols from /usr/lib/libopencore-amrnb.so.0...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/libopencore-amrnb.so.0
Reading symbols from /usr/lib/i386-linux-gnu/libmp3lame.so.0...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libmp3lame.so.0
Reading symbols from /usr/lib/libfaac.so.0...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/libfaac.so.0
Reading symbols from /usr/local/lib/libopencv_flann.so.2.4...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/libopencv_flann.so.2.4
Reading symbols from /usr/local/lib/libopencv_features2d.so.2.4...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/libopencv_features2d.so.2.4
Reading symbols from /usr/lib/i386-linux-gnu/libfontconfig.so.1...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libfontconfig.so.1
Reading symbols from /usr/lib/i386-linux-gnu/libaudio.so.2...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libaudio.so.2
Reading symbols from /usr/lib/i386-linux-gnu/libfreetype.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libfreetype.so.6
Reading symbols from /usr/lib/i386-linux-gnu/libSM.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libSM.so.6
Reading symbols from /usr/lib/i386-linux-gnu/libICE.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libICE.so.6
Reading symbols from /usr/lib/i386-linux-gnu/libXi.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libXi.so.6
Reading symbols from /usr/lib/i386-linux-gnu/libXrender.so.1...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libXrender.so.1
Reading symbols from /usr/lib/i386-linux-gnu/libXext.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libXext.so.6
Reading symbols from /usr/lib/i386-linux-gnu/libX11.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libX11.so.6
Reading symbols from /lib/ld-linux.so.2...Reading symbols from /usr/lib/debug/lib/i386-linux-gnu/ld-2.15.so...done.
done.
Loaded symbols for /lib/ld-linux.so.2
Reading symbols from /usr/lib/nvidia-331/tls/libnvidia-tls.so.331.20...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/nvidia-331/tls/libnvidia-tls.so.331.20
Reading symbols from /usr/lib/nvidia-331/libnvidia-glcore.so.331.20...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/nvidia-331/libnvidia-glcore.so.331.20
Reading symbols from /lib/i386-linux-gnu/libdl.so.2...Reading symbols from /usr/lib/debug/lib/i386-linux-gnu/libdl-2.15.so...done.
done.
Loaded symbols for /lib/i386-linux-gnu/libdl.so.2
Reading symbols from /usr/lib/libImath.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/libImath.so.6
Reading symbols from /usr/lib/libIex.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/libIex.so.6
Reading symbols from /usr/lib/libIlmThread.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/libIlmThread.so.6
Reading symbols from /usr/lib/i386-linux-gnu/libgmodule-2.0.so.0...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libgmodule-2.0.so.0
Reading symbols from /usr/lib/i386-linux-gnu/libxml2.so.2...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libxml2.so.2
Reading symbols from /usr/lib/i386-linux-gnu/libffi.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libffi.so.6
Reading symbols from /lib/i386-linux-gnu/libpcre.so.3...(no debugging symbols found)...done.
Loaded symbols for /lib/i386-linux-gnu/libpcre.so.3
Reading symbols from /usr/lib/i386-linux-gnu/libgstbase-0.10.so.0...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libgstbase-0.10.so.0
Reading symbols from /usr/lib/i386-linux-gnu/liborc-0.4.so.0...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/liborc-0.4.so.0
Reading symbols from /usr/lib/i386-linux-gnu/libraw1394.so.11...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libraw1394.so.11
Reading symbols from /lib/i386-linux-gnu/libusb-1.0.so.0...(no debugging symbols found)...done.
Loaded symbols for /lib/i386-linux-gnu/libusb-1.0.so.0
Reading symbols from /usr/local/lib/libv4l2.so.0...done.
Loaded symbols for /usr/local/lib/libv4l2.so.0
Reading symbols from /usr/lib/i386-linux-gnu/libogg.so.0...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libogg.so.0
Reading symbols from /lib/i386-linux-gnu/libexpat.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/i386-linux-gnu/libexpat.so.1
Reading symbols from /usr/lib/i386-linux-gnu/libXt.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libXt.so.6
Reading symbols from /usr/lib/i386-linux-gnu/libXau.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libXau.so.6
Reading symbols from /lib/i386-linux-gnu/libuuid.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/i386-linux-gnu/libuuid.so.1
Reading symbols from /usr/lib/i386-linux-gnu/libxcb.so.1...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libxcb.so.1
Reading symbols from /usr/local/lib/libv4lconvert.so.0...done.
Loaded symbols for /usr/local/lib/libv4lconvert.so.0
Reading symbols from /usr/lib/i386-linux-gnu/libXdmcp.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/i386-linux-gnu/libXdmcp.so.6
Reading symbols from /usr/lib/i386-linux-gnu/gconv/UTF-16.so...Reading symbols from /usr/lib/debug/usr/lib/i386-linux-gnu/gconv/UTF-16.so...done.
done.
Loaded symbols for /usr/lib/i386-linux-gnu/gconv/UTF-16.so
Reading symbols from /usr/lib/libicui18n.so.48...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/libicui18n.so.48
Reading symbols from /usr/lib/libicuuc.so.48...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/libicuuc.so.48
Reading symbols from /usr/lib/libicudata.so.48...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/libicudata.so.48
Failed to read a valid object file image from memory.
0x074444a2 in ?? () from /usr/lib/i386-linux-gnu/libfontconfig.so.1
(gdb) 

最佳答案

A segmentation fault occurs when the function cvCreateFileCapture is sometimes invoked using a network URL as argument, No error occur if the argument is a file on disk.

根据问题的症状,您的程序遇到了某种内存损坏。在所有 网络 URL 流执行正在执行某些操作的概率(内存溢出/覆盖) 如果您使用网络 URL,您似乎能够重现此问题。但是请不要假设如果 URL 是磁盘上的文件(本地),那么它就没有任何问题。腐败也有可能以这种方式发生,只是效果会延迟。内存损坏问题很难调试,如果不对我们的程序进行广泛的分析,就没有简单的步骤来识别它们。

查看堆栈跟踪,几乎不可能找出根本原因,因为这些段错误可能是程序在早期执行过程中所做的一些真正错误的事情的影响。

识别这些内存损坏的最佳方法是使用一些动态工具 调试器(Windows 上的WinDBG/PageHeap)。从你的问题(段错误)来看,你可能正在Linux平台上运行。所以你可能想在 Valgrind/GDB 中附加你的程序(a.out)。

$ valgrind --tool=memcheck --db-attach=yes ./a.out

这样,当您的第一个内存错误发生时,Valgrind 会将您的程序附加到调试器中 检测到,以便您可以进行实时调试(GDB)。这应该是理解和解决您的问题的最佳方式。一旦您能够找出第一个错误,请修复它并重新运行它,然后查看您遇到的其他错误。应该执行此步骤,直到 Valgrind 报告没有错误为止。

关于c++ - 在网络 URL 上调用函数 cvCreateFileCapture 时有时会出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22981774/

相关文章:

c++ - 从 vector<point2f> 创建 Mat

c++ - 有限制的随机矩阵

c++ - 像 Adob​​e Photoshop 一样的 OpenCV 和 USM 锐化

c++ - 如何设置一个 std::vector 与另一个,其中两个是不同类的 vector ?

c++ - 如何实现接受任何容器类型的功能?

c++ - 如何在 C++ 编译时实现有向无环图 DAG

c++ - 如何在 eclipse ".pro File Editor"中打开

c++ - OpenCV RGB值检测?

c++ - << 运算符与 C++ 中字符串的重载 + 运算符

c++ - 列出未使用的符号