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 в моей системе.

0 ответов

Другие вопросы по тегам