简单的C ++ OpenCV imshow示例崩溃与分段错误

时间:2016-12-20 11:08:32

标签: c++ linux opencv segmentation-fault fedora-25

(抱歉英语不好,我是德国人)

你好程序员,

理论上,这个简单的C ++ OpenCV示例应该显示一个100x100的黑色图像,等到按下一个键,将“仍在运行!\ n”写入错误流并退出并退出代码123.

当我运行此程序时,我看到黑色图像,直到我按下一个键。在我看一下终端之前,似乎一切正常:

$ ./a.out
still running!
Segmentation fault (Core dumped) #shouldn't happen
$ echo $?
139       #should be 123
$

如果有人能够回答下列问题之一,我将感激不尽:      - 为什么这个程序会产生分段错误?     - 我怎样才能解决这个问题?      - 源代码有问题吗?如果没有,哪个库/程序负责此错误?

我可以听到你尖叫:“但是,如果它只是在调用退出/返回时崩溃,你为什么关心?如果程序正常退出或崩溃,它没有任何区别”。 你是对的,但我担心导致这个程序在退出时崩溃的同一个bug可能会导致程序在运行时崩溃/导致其他奇怪的问题。

#include <opencv2/opencv.hpp>
#include <iostream>
int main(void) {
    {
        cv::Mat test(100, 100, CV_8UC1, cv::Scalar(0));
        //cv::namedWindow( "testName", cv::WINDOW_NORMAL ); //doesn't help
        //cv::namedWindow( "testName", cv::WINDOW_OPENGL ); //doesn't help
        cv::imshow( "testName", test );
        cv::waitKey(0);
        //cv::destroyAllWindows(); //doesn't help
    }
    std::cerr << "still running!\n";
    return 123;
}

汇编:

$ g++ `pkg-config --cflags --libs opencv` main.cpp

$ g++ -lopencv_core -lopencv_highgui main.cpp

关于我的电脑的一些其他信息:

操作系统:Linux(Fedora 25)

  

$ cat / proc / version

     

Linux版本4.8.14-300.fc25.x86_64(mockbuild@bkernel02.phx2.fedoraproject.org)(gcc版本6.2.1 20160916(红帽6.2.1-2)(GCC))#1 SMP周一12月12 16:31:04 UTC 2016

使用以下命令安装OpenCV:dnf install -y opencv*

输入dnf remove opencv and hitting tab会产生以下输出:

opencv-3.1.0-8.fc25.x86_64             opencv-devel-3.1.0-8.fc25.x86_64
opencv-contrib-3.1.0-8.fc25.x86_64     opencv-devel-docs-3.1.0-8.fc25.noarch
opencv-core-3.1.0-8.fc25.x86_64        opencv-python-3.1.0-8.fc25.x86_64

更新

$ valgrind ./a.out
==24083== Memcheck, a memory error detector
==24083== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==24083== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==24083== Command: ./a.out
==24083== 
^C==24083== 
==24083== Process terminating with default action of signal 2 (SIGINT)
==24083==    at 0x401B4B5: open (in /usr/lib64/ld-2.24.so)
==24083==    by 0x4005547: open_verify.constprop.7 (in /usr/lib64/ld-2.24.so)
==24083==    by 0x40090BF: _dl_map_object (in /usr/lib64/ld-2.24.so)
==24083==    by 0x400DDFF: openaux (in /usr/lib64/ld-2.24.so)
==24083==    by 0x4010873: _dl_catch_error (in /usr/lib64/ld-2.24.so)
==24083==    by 0x400E44D: _dl_map_object_deps (in /usr/lib64/ld-2.24.so)
==24083==    by 0x4003146: dl_main (in /usr/lib64/ld-2.24.so)
==24083==    by 0x401991E: _dl_sysdep_start (in /usr/lib64/ld-2.24.so)
==24083==    by 0x4004F67: _dl_start (in /usr/lib64/ld-2.24.so)
==24083==    by 0x4000CD7: ??? (in /usr/lib64/ld-2.24.so)
==24083== Jump to the invalid address stated on the next line
==24083==    at 0x5A6: ???
==24083==    by 0x4005547: open_verify.constprop.7 (in /usr/lib64/ld-2.24.so)
==24083==    by 0x40090BF: _dl_map_object (in /usr/lib64/ld-2.24.so)
==24083==    by 0x400DDFF: openaux (in /usr/lib64/ld-2.24.so)
==24083==    by 0x4010873: _dl_catch_error (in /usr/lib64/ld-2.24.so)
==24083==    by 0x400E44D: _dl_map_object_deps (in /usr/lib64/ld-2.24.so)
==24083==    by 0x4003146: dl_main (in /usr/lib64/ld-2.24.so)
==24083==    by 0x401991E: _dl_sysdep_start (in /usr/lib64/ld-2.24.so)
==24083==    by 0x4004F67: _dl_start (in /usr/lib64/ld-2.24.so)
==24083==    by 0x4000CD7: ??? (in /usr/lib64/ld-2.24.so)
==24083==  Address 0x5a6 is not stack'd, malloc'd or (recently) free'd
==24083== 
==24083== 
==24083== Process terminating with default action of signal 11 (SIGSEGV)
==24083==  Bad permissions for mapped region at address 0x5A6
==24083==    at 0x5A6: ???
==24083==    by 0x4005547: open_verify.constprop.7 (in /usr/lib64/ld-2.24.so)
==24083==    by 0x40090BF: _dl_map_object (in /usr/lib64/ld-2.24.so)
==24083==    by 0x400DDFF: openaux (in /usr/lib64/ld-2.24.so)
==24083==    by 0x4010873: _dl_catch_error (in /usr/lib64/ld-2.24.so)
==24083==    by 0x400E44D: _dl_map_object_deps (in /usr/lib64/ld-2.24.so)
==24083==    by 0x4003146: dl_main (in /usr/lib64/ld-2.24.so)
==24083==    by 0x401991E: _dl_sysdep_start (in /usr/lib64/ld-2.24.so)
==24083==    by 0x4004F67: _dl_start (in /usr/lib64/ld-2.24.so)
==24083==    by 0x4000CD7: ??? (in /usr/lib64/ld-2.24.so)
==24083== 
==24083== HEAP SUMMARY:
==24083==     in use at exit: 0 bytes in 0 blocks
==24083==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==24083== 
==24083== All heap blocks were freed -- no leaks are possible
==24083== 
==24083== For counts of detected and suppressed errors, rerun with: -v
==24083== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Segmentation fault (Speicherabzug geschrieben)

更新#2

$ g++ -g `pkg-config --cflags --libs opencv` main.cpp; gdb a.out
GNU gdb (GDB) Fedora 7.12-29.fc25
Copyright (C) 2016 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 "x86_64-redhat-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.out...done.
(gdb) run
Starting program: /home/volker/Dropbox/Roboter/eclipse/CVS/source/a.out 
Missing separate debuginfos, use: dnf debuginfo-install glibc-2.24-3.fc25.x86_64
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7fffc86e1700 (LWP 5063)]
[New Thread 0x7fffbd3b9700 (LWP 5072)]
[New Thread 0x7fffb5974700 (LWP 5089)]
[New Thread 0x7fffb5173700 (LWP 5090)]
[New Thread 0x7fffb4972700 (LWP 5091)]
[New Thread 0x7fffa796c700 (LWP 5100)]
still running!

Thread 7 "QDBusConnection" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffa796c700 (LWP 5100)]
0x00007fffefa5601d in QObject::disconnect(QObject const*, char const*, QObject const*, char const*) () from /lib64/libQt5Core.so.5
Missing separate debuginfos, use: dnf debuginfo-install LONG LIST OF PACKAGES
(gdb) backtrace
#0  0x00007fffefa5601d in QObject::disconnect(QObject const*, char const*, QObject const*, char const*) () from /lib64/libQt5Core.so.5
#1  0x00007fffbec6bfb0 in QDBusConnectionPrivate::closeConnection() () from /lib64/libQt5DBus.so.5
#2  0x00007fffbec58852 in QDBusConnectionManager::run() () from /lib64/libQt5DBus.so.5
#3  0x00007fffef88b9da in QThreadPrivate::start(void*) () from /lib64/libQt5Core.so.5
#4  0x00007ffff077e6ca in start_thread () from /lib64/libpthread.so.0
#5  0x00007ffff0a9cf6f in clone () from /lib64/libc.so.6
(gdb) 

1 个答案:

答案 0 :(得分:1)

我使用"gdb""eclipse-cdt"进行了调试。

  1. 使用&#34; gdb&#34;运行程序并使用"dnf debuginfo-install".
  2. 安装调试信息
  3. 监控"QApplicationPrivate :: app_style"
  4. 的值和类型
  5. 在&#34; adwaitastyleplugin.cpp&#34;的"StylePlugin :: ~ StylePlugin ()"中设置断点。
  6. 查看&#34; qlibrary.cpp:bool QLibraryPrivate :: unload(UnloadFlag flag)&#34;在调用层次结构视图中。
  7. 我确认了

    "QLibraryPrivate :: unload ()" will destroy "QApplicationPrivate :: app_style".
    "QDBusConnectionPrivate :: closeConnection ()"
    

    应该在"QLibraryPrivate :: unload ()"之前执行。

    另外,我担心类"QCommonStyle"的基类"adwaita :: style"的析构函数不是"virtual"

    我还在调查。