Доброго времени суток.
Программа с таблицей 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
Буду благодарен за любую помощь.
>[оверквотинг удален]
>
>Сообщение при падении:
>
>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
>Буду благодарен за любую помощь.добейся корки, и после этого посмотри стек, потому как это ассерт вызванный из glibc
означающий просто не найден данный emission в списке. возможно туда(в метод pop объекта emission) передали NULL или еще какой нибудь мусор.про сегфаулт ничего не скажу. опять таки корку смотри.
Запустил приложение через 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();
}
//-----------------------------------------------------------------По-прежнему, не могу отыскать ошибку.
>
>Запустил приложение через gdb, вот что получил при падении:
>а вы, простите, еще и потоки используете?
ууу... по мне так у вас слишком сложное приложение.но хочу заметить, это не та ошибка какую вы указывали в первый раз.
здесь идут ассерты на то что ссылки в аругментах функций не являются объектами gobjectтут возможны варианты.
а) вы их где то затерли
б) передали неправильный параметр в функцию(искуственно заткнув рот компилятору приведением типов)
в) где то отсоединили объект (счетчик ссылок на стал равным нулю) и его удалила система управления объектами gobject. в дальнейшем вы его пытаетесь использвать как будто ничего не случилось.
>Program received signal SIGSEGV, Segmentation fault.
>[Switching to Thread 1086968256 (LWP 1940)]
>0x409f4fd7 in _int_malloc () from /lib/tls/libc.so.6Скорее всего память где-то раньше была перепахана, если свалилось в malloc.
Поэтому искать надо не в функциях выше по стеку, а в предыдущих действиях.