(извините за плохой английский, я немец)
Привет программисты,
Теоретически, этот простой пример C ++ OpenCV должен отображать черное изображение размером 100×100, ждать, пока нажата клавиша, записать «все еще работает! \ 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)
$ cat / proc / version
Версия Linux 4.8.14-300.fc25.x86_64 ([email protected]) (версия gcc 6.2.1 20160916 (Red Hat 6.2.1-2) (GCC)) # 1 SMP Mon.12.12 16: 31:04 UTC 2016
OpenCV был установлен с помощью следующей команды: dnf install -y opencv*
При вводе dnf удалить opencv и попадание на вкладку приводит к следующему выводу:
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)
Я отладил с "gdb"
а также "eclipse-cdt"
,
gdb
«и установите отладочную информацию с "dnf debuginfo-install".
"QApplicationPrivate :: app_style"
,"StylePlugin :: ~ StylePlugin ()"
из «adwaitastyleplugin.cpp».Я подтвердил, что
"QLibraryPrivate :: unload ()" will destroy "QApplicationPrivate :: app_style".
"QDBusConnectionPrivate :: closeConnection ()"
должно быть выполнено до "QLibraryPrivate :: unload ()"
,
Также меня беспокоит, что деструктор базового класса "QCommonStyle"
класса "adwaita :: style"
не является "virtual"
,
Я все еще расследую.
Других решений пока нет …