The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Приложение падает при интенсивном использовании GTK::TreeVie, !*! HellFire, 21-Ноя-08, 12:01  [смотреть все]
Доброго времени суток.
Программа с таблицей 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
Буду благодарен за любую помощь.

  • Приложение падает при интенсивном использовании GTK::TreeVie, !*! NuINu, 14:55 , 21-Ноя-08 (1)
    >[оверквотинг удален]
    >
    >Сообщение при падении:
    >
    >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 или еще какой нибудь мусор.

    про сегфаулт ничего не скажу. опять таки корку смотри.

    • Приложение падает при интенсивном использовании GTK::TreeVie, !*! HellFire, 16:21 , 27-Ноя-08 (2)

      Запустил приложение через 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();
      }
      //-----------------------------------------------------------------

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

      • Приложение падает при интенсивном использовании GTK::TreeVie, !*! NuINu, 16:55 , 27-Ноя-08 (3)
        >
        >Запустил приложение через gdb, вот что получил при падении:
        >

        а вы, простите, еще и потоки используете?
        ууу... по мне так у вас слишком сложное приложение.

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

        тут возможны варианты.
        а) вы их где то затерли
        б) передали неправильный параметр в функцию(искуственно заткнув рот компилятору приведением типов)
        в) где то отсоединили объект (счетчик ссылок на стал равным нулю) и его удалила система управления объектами gobject. в дальнейшем вы его пытаетесь использвать как будто ничего не случилось.

      • Приложение падает при интенсивном использовании GTK::TreeVie, !*! Michelnok, 02:48 , 28-Ноя-08 (4)
        >Program received signal SIGSEGV, Segmentation fault.
        >[Switching to Thread 1086968256 (LWP 1940)]
        >0x409f4fd7 in _int_malloc () from /lib/tls/libc.so.6

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру