(对不起英语不好,我是德国人)
各位程序员,
理论上,这个简单的 C++ OpenCV 示例应该显示一个 100x100 的黑色图像,等到按下一个键,将“仍在运行!\n”写入错误流并以退出代码 123 退出。
当我运行这个程序时,我看到黑色图像,直到我按下一个键。在我查看终端之前,似乎一切正常:
$ ./a.out
still running!
Segmentation fault (Core dumped) #shouldn't happen
$ echo $?
139 #should be 123
$
如果有人能回答我以下问题之一,我将不胜感激: - 为什么这个程序会产生分段错误?- 我怎样才能解决这个问题?- 源代码有问题吗?如果不是,哪个库/程序会导致此错误?
我可以听到你在尖叫:“但是,如果它只在调用 exit/return 时崩溃,你为什么要关心?程序正常退出或崩溃都没有区别”。你是对的,但我担心导致该程序在退出时崩溃的相同错误可能会导致程序在运行时崩溃/导致其他奇怪的问题。
#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)
$ 猫 /proc/版本
Linux 版本 4.8.14-300.fc25.x86_64 (mockbuild@bkernel02.phx2.fedoraproject.org) (gcc 版本 6.2.1 20160916 (Red Hat 6.2.1-2) (GCC)) #1 SMP Mon Dec 12 16: 2016 年 31:04 世界标准时间
使用以下命令安装 OpenCV:dnf install -y opencv*
输入 dnf remove opencv 并点击 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)