Segfault за пределами моего собственного кода - как я могу найти ошибку?
В настоящее время я пытаюсь отобразить простую трехмерную сцену в моей программе Qt 4.8. Библиотека, которая доступна как в Ubuntu, так и в openSUSE, называется OpenSceneGraph. Я скачал класс QOsgWidget и добавил его в свою программу. Во время выполнения я открываю новое окно и добавляю созданный по умолчанию экземпляр QOsgWidget
к макету этого QWidget
, Вылетает прямо в отладочной сборке. Когда я запускаю его в gdb
, Я вижу новое открытое окно, в котором, кажется, есть "дыра", я вижу свою фоновую картинку, но она не обновляется при перемещении окна.
Когда я попытался получить обратную трассировку, я не получил ничего, что связывало бы ошибку с любым моим кодом:
(gdb) bt
#0 0x00007fffcdd68f4f in ?? () from /usr/lib/x86_64-linux-gnu/dri/i965_dri.so
#1 0x00007fffcdcf6bd0 in ?? () from /usr/lib/x86_64-linux-gnu/dri/i965_dri.so
#2 0x00007fffed0e15ae in osgUtil::RenderStage::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) () from /usr/lib/x86_64-linux-gnu/libosgUtil.so.100
#3 0x00007fffed0e0587 in osgUtil::RenderStage::drawInner(osg::RenderInfo&, osgUtil::RenderLeaf*&, bool&) () from /usr/lib/x86_64-linux-gnu/libosgUtil.so.100
#4 0x00007fffed0e244f in osgUtil::RenderStage::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) () from /usr/lib/x86_64-linux-gnu/libosgUtil.so.100
#5 0x00007fffed0ea32c in osgUtil::SceneView::draw() () from /usr/lib/x86_64-linux-gnu/libosgUtil.so.100
#6 0x00007ffff518a837 in osgViewer::Renderer::draw() () from /usr/lib/x86_64-linux-gnu/libosgViewer.so.100
#7 0x00007ffff4b70f19 in osg::GraphicsContext::runOperations() () from /usr/lib/x86_64-linux-gnu/libosg.so.100
#8 0x00007ffff4bc1da8 in osg::OperationThread::run() () from /usr/lib/x86_64-linux-gnu/libosg.so.100
#9 0x00007ffff4b73158 in osg::GraphicsThread::run() () from /usr/lib/x86_64-linux-gnu/libosg.so.100
#10 0x00007fffecda5718 in OpenThreads::ThreadPrivateActions::StartThread(void*) () from /usr/lib/x86_64-linux-gnu/libOpenThreads.so.20
#11 0x00007ffff34f96aa in start_thread (arg=0x7fffca55b700) at pthread_create.c:333
#12 0x00007ffff3816eed in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109
Это код, где я создаю экземпляр:
В файле window3d.h
:
#include "QOsgWidget.h"
#include <QWidget>
namespace Ui {
class Window3D;
}
class Window3D : public QWidget {
Q_OBJECT
public:
explicit Window3D(QWidget *parent,
const std::vector<std::vector<Circles>> &all_circles);
~Window3D();
private:
Ui::Window3D *ui;
const std::vector<std::vector<Circles>> &all_circles;
QOsgWidget osg;
};
И соответствующий источник:
#include "window3d.h"
#include "ui_window3d.h"
Window3D::Window3D(QWidget *parent,
const std::vector<std::vector<Circles>> &all_circles)
: QWidget(parent), ui(new Ui::Window3D), all_circles{all_circles} {
ui->setupUi(this);
}
Window3D::~Window3D() {
delete ui;
}
Класс главного окна имеет слот для действий меню, который выглядит следующим образом:
void MainWindow::open_3d() {
window_3d.reset(new Window3D(nullptr, sm.all_circles));
window_3d->show();
}
Член window_3d
это std::unique_ptr<Window3D>
,
Так как я на самом деле ничего не делаю, кроме использования загруженного QOsgWidget
и создавая его экземпляр, я не понимаю, почему он потерпит крах.
Есть ли способ приблизиться к ошибке с помощью инструментов отладки, или мне нужно найти эту ошибку где-нибудь в документации OpenSceneGraph?
Я вижу, что при каждом запуске приложения в режиме отладки появляются разные сообщения об ошибках. Я добавил вывод в начале функций, чтобы показать, работает ли он вообще. Этот запуск разбился с SIGSEGV:
QOsgWidget::ctor
QOsgWidget::setupContext()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
Я попытался снова, и после следующего вывода окно фактически показывало, хотя я не мог закрыть это:
QOsgWidget::ctor
QOsgWidget::setupContext()
QOsgWidget::frame()
QOsgWidget::frame()
В следующий раз я получу SIGABRT:
QOsgWQOsgWidget::ctor
QOsgWidget::setupContext()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
megrama-qt: ../../src/xcb_io.c:179: dequeue_pending_request: Assertion `!xcb_xlib_unknown_req_in_deq' failed.idget::frame()
При следующем запуске я получаю еще один SIGSEGV, на этот раз с более frame()
звонки
QOsgWidget::ctor
QOsgWidget::setupContext()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
QOsgWidget::frame()
Случайный характер этого выглядит как проблема многопоточности.
Когда я компилирую проект из репозитория GitHub, он компилируется с использованием Qt 5 в моей системе, но также вылетает с SIGSEGV в моей системе.