LINUX.ORG.RU

Прога падает при использовании GTK::TreeView::queue_draw()


0

0

Доброго времени суток. Программа с таблицей TreeView, на которую постоянно поступают новые данные. Я использую метод GTK::TreeView::queue_draw(), чтобы принудительно перерисовать таблицу, после того, как записываю новые данные в TreeModel.

Программа работает пару суток, затем падает, что меня очень сильно не устраивает. Сообщение при падении: GLib-GObject-ERROR **: file gsignal.c: line 646 (emission_pop): should not be reached aborting...

Иногда вываливается Segmentation fault.

Использую gtkmm2-2.2.8, gcc 3.3.3, SuSE 9.3 Буду благодарен за любую помощь.

Ответ на: комментарий от fghj

Валгринд успевает за двое суток выдать столько информации, что для меня разобраться в ней довольно сложно :(

HellFire
() автор топика
Ответ на: комментарий от HellFire

честно говоря непонятно, начните читать лог сначала, смотрите ошибка, исправляете, делаете grep -v убираете ее из логов, читаете дальше, неужели так сложно?

fghj ★★★★★
()
Ответ на: комментарий от fghj

Спасибо :) попробую, когда приложение в следующий раз упадет.

Запустил приложение через gdb, вот что получил при падении:

//-----------------------------------------------------------------

(monitor-linux:1940): GLib-GObject-CRITICAL **: file gobject.c: line 1337 (g_object_unref): assertion `G_IS_OBJECT (object)' failed

(monitor-linux:1940): Gtk-CRITICAL **: file gtkwidget.c: line 1827 (gtk_widget_hide): assertion `GTK_IS_WIDGET (widget)' failed

(monitor-linux:1940): GLib-GObject-CRITICAL **: file gobject.c: line 1337 (g_object_unref): assertion `G_IS_OBJECT (object)' failed

(monitor-linux:1940): Gtk-CRITICAL **: file gtkwidget.c: line 2176 (gtk_widget_queue_draw): assertion `GTK_IS_WIDGET (widget)' failed

Program received signal SIGSEGV, Segmentation fault.

[Switching to Thread 1086968256 (LWP 1940)]

0x409f4fd7 in _int_malloc () from /lib/tls/libc.so.6

(gdb) where

#0 0x409f4fd7 in _int_malloc () from /lib/tls/libc.so.6

#1 0x409f6a14 in malloc () from /lib/tls/libc.so.6

#2 0x409ecac3 in vasprintf () from /lib/tls/libc.so.6

#3 0x40838dd0 in g_strdup_vprintf () from /opt/gnome/lib/libglib-2.0.so.0

#4 0x4083a468 in g_string_append_printf_internal () from /opt/gnome/lib/libglib-2.0.so.0

#5 0x4083a4a4 in g_string_append_printf () from /opt/gnome/lib/libglib-2.0.so.0

#6 0x4082ae4c in g_log_default_handler () from /opt/gnome/lib/libglib-2.0.so.0

#7 0x4082b0b6 in g_logv () from /opt/gnome/lib/libglib-2.0.so.0

#8 0x4082b2e2 in g_log () from /opt/gnome/lib/libglib-2.0.so.0

#9 0x4047b048 in gtk_widget_queue_draw () from /opt/gnome/lib/libgtk-x11-2.0.so.0

#10 0x401b1886 in Gtk::Widget::queue_draw () from /opt/gnome/lib/libgtkmm-2.0.so.1

#11 0x0806f0d7 in TableWindow::on_dispatcher_update (this=0xbfffe4a0) at ms_window.cc:222 //--------------------------------вызов метода из моего кода

#12 0x0806a34e in SigC::ClassSlot0_<void, TableWindow>::proxy (s=0x80e9450) at class_slot.h:82

#13 0x08066718 in SigC::Signal0<void, SigC::Marshal<void> >::emit_ (data=0x80e7340) at signal.h:625

#14 0x407a173b in Glib::DispatchNotifier::pipe_io_handler () from /opt/gnome/lib/libglibmm-2.0.so.1

#15 0x407a2213 in SigC::ClassSlot1_<bool, Glib::IOCondition, Glib::DispatchNotifier>::proxy () from /opt/gnome/lib/libglibmm-2.0.so.1

#16 0x407a490d in Glib::IOSource::dispatch () from /opt/gnome/lib/libglibmm-2.0.so.1

#17 0x407a4b77 in Glib::Source::dispatch_vfunc () from /opt/gnome/lib/libglibmm-2.0.so.1

#18 0x408229ca in g_main_context_dispatch () from /opt/gnome/lib/libglib-2.0.so.0

#19 0x40824adb in g_main_context_iterate () from /opt/gnome/lib/libglib-2.0.so.0

#20 0x40824d07 in g_main_loop_run () from /opt/gnome/lib/libglib-2.0.so.0

#21 0x4039311f in gtk_main () from /opt/gnome/lib/libgtk-x11-2.0.so.0

#22 0x40150bd7 in Gtk::Main::run_impl () from /opt/gnome/lib/libgtkmm-2.0.so.1

#23 0x40150ca5 in Gtk::Main::run () from /opt/gnome/lib/libgtkmm-2.0.so.1

#24 0x08069916 in main (argc=1, argv=0xbfffe864) at ms_main.cc:138

//-----------------------------------------------------------------

В классе TableWindow есть поле

//-----------------------------------------------------------------

Glib::Dispatcher dispatcher_update;

//-----------------------------------------------------------------

В конструкторе класса TableWindow я присоединяю обработчик (метод TableWindow::on_dispatcher_update() ) к диспатчеру

//-----------------------------------------------------------------

this->dispatcher_update.connect(SigC::slot_class(*this, &TableWindow::on_dispatcher_update) );

//-----------------------------------------------------------------

А потом в отдельном потоке пишу следующее, чтобы вызвать перерисовку таблицы:

//-----------------------------------------------------------------

w->dispatcher_update();

//-----------------------------------------------------------------

А вот и метод TableWindow::on_dispatcher_update()

//-----------------------------------------------------------------

void TableWindow::on_dispatcher_update() { m_TreeView.queue_draw(); }

//-----------------------------------------------------------------

По-прежнему, не могу отыскать ошибку.

HellFire
() автор топика

Вообщем, могу сказать, что GTK+ и gtkmm не предназанчены для написания долгоиграющих приложений, поэтому вообщем-то не удивительно, что они падают.
Вижу два выхода:
- вчитываться в свои исходники;
- пытаться выловить ошибку стрессовым режимом работы.

ShprotX
()
Ответ на: комментарий от ShprotX

> Вижу два выхода

ах да, забыл:
- ...
- разделить прогу на два процесса: падающий фронтенд и нерушимый бэкенд;
- убиться об стенку.

ShprotX
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.