After an evaluation, GNOME has moved from Bugzilla to GitLab. Learn more about GitLab.
No new issues can be reported in GNOME Bugzilla anymore.
To report an issue in a GNOME project, go to GNOME GitLab.
Do not go to GNOME Gitlab for: Bluefish, Doxygen, GnuCash, GStreamer, java-gnome, LDTP, NetworkManager, Tomboy.
Bug 660347 - The Find ID feature crashes
The Find ID feature crashes
Status: RESOLVED FIXED
Product: glom
Classification: Other
Component: data mode
git master
Other Linux
: Normal normal
: ---
Assigned To: Murray Cumming
Murray Cumming
Depends on: 661058 665659
Blocks:
 
 
Reported: 2011-09-28 09:51 UTC by Murray Cumming
Modified: 2013-10-27 19:37 UTC
See Also:
GNOME target: ---
GNOME version: ---


Attachments
#include <giomm/file.h> (4.39 KB, patch)
2011-09-29 07:56 UTC, Murray Cumming
none Details | Review
test_dialog_choose_id3.patch (16.07 KB, patch)
2011-09-29 09:36 UTC, Murray Cumming
none Details | Review
Scrolledwindow: unset adjustments after removal, not before. (1.11 KB, patch)
2011-12-03 15:09 UTC, Krzesimir Nowak
none Details | Review

Description Murray Cumming 2011-09-28 09:51:30 UTC
Using the Find button next to foreign key IDs (such as the Publisher ID in the Albums table in the Music example), causes a a crash after choosing the found record.

Here is the gdb backtrace at this warning
"
  Glib::wrap_create_new_wrapper: Attempted to create a 2nd C++ wrapper for a C instance whose C++ wrapper has been deleted.
"
just before the crash. There is no valgrind error before this.


Breakpoint 1, g_log (log_domain=0x15aafb6 "glibmm", log_level=G_LOG_LEVEL_WARNING, 
    format=0x15aafc0 "Glib::wrap_create_new_wrapper: Attempted to create a 2nd C++ wrapper for a C instance whose C++ wrapper has been deleted.")
    at gmessages.c:590
590	  va_start (args, format);
(gdb) bt
  • #0 g_log
    at gmessages.c line 590
  • #1 Glib::wrap_create_new_wrapper
    at wrap.cc line 102
  • #2 Glib::wrap_auto
    at wrap.cc line 187
  • #3 Glib::wrap
    at widget.cc line 3354
  • #4 Gtk::CellRenderer_Class::get_preferred_width_vfunc_callback
    at cellrenderer.cc line 63
  • #5 gtk_cell_renderer_get_preferred_width
    at gtkcellrenderer.c line 1414
  • #6 gtk_cell_area_request_renderer
    at gtkcellarea.c line 3590
  • #7 compute_size
    at gtkcellareabox.c line 1533
  • #8 gtk_cell_area_box_get_preferred_width
    at gtkcellareabox.c line 1822
  • #9 gtk_cell_area_get_preferred_width
    at gtkcellarea.c line 2096
  • #10 gtk_tree_view_column_cell_get_size
    at gtktreeviewcolumn.c line 2896
  • #11 validate_row
    at gtktreeview.c line 6080
  • #12 validate_visible_area
    at gtktreeview.c line 6293
  • #13 do_presize_handler
    at gtktreeview.c line 6760
  • #14 gtk_tree_view_bin_process_updates
    at gtktreeview.c line 6815
  • #15 gtk_tree_view_adjustment_changed
    at gtktreeview.c line 11241
  • #16 gtk_tree_view_set_hadjustment
    at gtktreeview.c line 11525
  • #17 gtk_tree_view_set_property
    at gtktreeview.c line 1786
  • #18 object_set_property
    at gobject.c line 1199
  • #19 g_object_set_valist
    at gobject.c line 1727
  • #20 g_object_set
    at gobject.c line 1833
  • #21 gtk_scrolled_window_remove
    at gtkscrolledwindow.c line 1997
  • #22 Gtk::Container_Class::remove_callback
    at container.cc line 168
  • #23 g_cclosure_marshal_VOID__OBJECT
    at gmarshal.c line 644
  • #24 g_type_class_meta_marshal
    at gclosure.c line 885
  • #25 g_closure_invoke
    at gclosure.c line 774
  • #26 signal_emit_unlocked_R
    at gsignal.c line 3202
  • #27 g_signal_emit_valist
    at gsignal.c line 3003
  • #28 g_signal_emit
    at gsignal.c line 3060
  • #29 gtk_container_remove
    at gtkcontainer.c line 1539
  • #30 gtk_widget_dispose
    at gtkwidget.c line 10655
  • #31 Gtk::Widget_Class::dispose_vfunc_callback
    at widget.cc line 595
  • #32 g_object_run_dispose
    at gobject.c line 945
  • #33 Gtk::Object::_release_c_instance
    at object.cc line 148
  • #34 Gtk::Object::destroy_
    at object.cc line 260
  • #35 Gtk::TreeView::~TreeView
    at treeview.cc line 1137
  • #36 Glom::DbAddDel::~DbAddDel
    at glom/mode_data/db_adddel/db_adddel.cc line 115
  • #37 Glom::DbAddDel_WithButtons::~DbAddDel_WithButtons
    at glom/mode_data/db_adddel/db_adddel_withbuttons.cc line 53
  • #38 Glom::Box_Data_List::~Box_Data_List
    at glom/mode_data/box_data_list.cc line 66
  • #39 Glom::DataWidgetChildren::Dialog_ChooseID::~Dialog_ChooseID
    at glom/mode_data/datawidget/dialog_choose_id.cc line 71
  • #40 Glom::DataWidgetChildren::Dialog_ChooseID::~Dialog_ChooseID
    at glom/mode_data/datawidget/dialog_choose_id.cc line 75
  • #41 Glom::DataWidget::offer_related_record_id_find
    at glom/mode_data/datawidget/datawidget.cc line 661
  • #42 Glom::DataWidget::on_button_select_id
    at glom/mode_data/datawidget/datawidget.cc line 578
  • #43 sigc::bound_mem_functor0<void, Glom::DataWidget>::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/mem_fun.h line 1787
  • #44 sigc::adaptor_functor<sigc::bound_mem_functor0<void, Glom::DataWidget> >::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/adaptors/adaptor_trait.h line 251
  • #45 sigc::internal::slot_call0<sigc::bound_mem_functor0<void, Glom::DataWidget>, void>::call_it
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/slot.h line 103
  • #46 sigc::slot0<void>::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/slot.h line 440
  • #47 Glib::SignalProxyNormal::slot0_void_callback
    at signalproxy.cc line 95
  • #48 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #49 g_closure_invoke
    at gclosure.c line 774
  • #50 signal_emit_unlocked_R
    at gsignal.c line 3342
  • #51 g_signal_emit_valist
    at gsignal.c line 3003
  • #52 g_signal_emit
    at gsignal.c line 3060
  • #53 gtk_button_clicked
    at gtkbutton.c line 1197
  • #54 gtk_real_button_released
    at gtkbutton.c line 1826
  • #55 Gtk::Button_Class::released_callback
    at button.cc line 240
  • #56 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #57 g_type_class_meta_marshal
    at gclosure.c line 885
  • #58 g_closure_invoke
    at gclosure.c line 774
  • #59 signal_emit_unlocked_R
    at gsignal.c line 3202
  • #60 g_signal_emit_valist
    at gsignal.c line 3003
  • #61 g_signal_emit
    at gsignal.c line 3060
  • #62 gtk_button_released
    at gtkbutton.c line 1183
  • #63 gtk_button_button_release
    at gtkbutton.c line 1718
  • #64 Gtk::Widget_Class::button_release_event_callback
    at widget.cc line 4449
  • #65 _gtk_marshal_BOOLEAN__BOXED
    at gtkmarshalers.c line 85
  • #66 g_type_class_meta_marshal
    at gclosure.c line 885
  • #67 g_closure_invoke
    at gclosure.c line 774
  • #68 signal_emit_unlocked_R
    at gsignal.c line 3310
  • #69 g_signal_emit_valist
    at gsignal.c line 3013
  • #70 g_signal_emit
    at gsignal.c line 3060
  • #71 gtk_widget_event_internal
    at gtkwidget.c line 6132
  • #72 gtk_widget_event
    at gtkwidget.c line 5848
  • #73 gtk_propagate_event
    at gtkmain.c line 2614
  • #74 gtk_main_do_event
    at gtkmain.c line 1889
  • #75 _gdk_event_emit
    at gdkevents.c line 71
  • #76 gdk_event_source_dispatch
    at gdkeventsource.c line 360
  • #77 g_main_dispatch
    at gmain.c line 2441
  • #78 g_main_context_dispatch
    at gmain.c line 3011
  • #79 g_main_context_iterate
    at gmain.c line 3089
  • #80 g_main_loop_run
    at gmain.c line 3297
  • #81 gtk_main
    at gtkmain.c line 1362
  • #82 Gtk::Main::run_impl
    at main.cc line 420
  • #83 Gtk::Main::run
    at main.cc line 384
  • #84 main
    at glom/main.cc line 613

Comment 1 Murray Cumming 2011-09-28 11:32:39 UTC
If I call remove_all_columns() in the DbAddDel descructor, I get this backtrace at the first warning:

Breakpoint 1, g_log (log_domain=0x15aafb6 "glibmm", log_level=G_LOG_LEVEL_WARNING, 
    format=0x15aafc0 "Glib::wrap_create_new_wrapper: Attempted to create a 2nd C++ wrapper for a C instance whose C++ wrapper has been deleted.") at gmessages.c:590
590	  va_start (args, format);
(gdb) bt
  • #0 g_log
    at gmessages.c line 590
  • #1 Glib::wrap_create_new_wrapper
    at wrap.cc line 102
  • #2 Glib::wrap_auto
    at wrap.cc line 187
  • #3 Glib::wrap
    at widget.cc line 3354
  • #4 Gtk::CellRenderer_Class::get_preferred_width_vfunc_callback
    at cellrenderer.cc line 63
  • #5 gtk_cell_renderer_get_preferred_width
    at gtkcellrenderer.c line 1414
  • #6 gtk_cell_area_request_renderer
    at gtkcellarea.c line 3590
  • #7 compute_size
    at gtkcellareabox.c line 1533
  • #8 gtk_cell_area_box_get_preferred_width
    at gtkcellareabox.c line 1822
  • #9 gtk_cell_area_get_preferred_width
    at gtkcellarea.c line 2096
  • #10 gtk_tree_view_column_cell_get_size
    at gtktreeviewcolumn.c line 2899
  • #11 validate_row
    at gtktreeview.c line 6088
  • #12 validate_visible_area
    at gtktreeview.c line 6301
  • #13 do_presize_handler
    at gtktreeview.c line 6768
  • #14 gtk_tree_view_bin_process_updates
    at gtktreeview.c line 6823
  • #15 gtk_tree_view_adjustment_changed
    at gtktreeview.c line 11266
  • #16 gtk_tree_view_set_hadjustment
    at gtktreeview.c line 11550
  • #17 gtk_tree_view_set_property
    at gtktreeview.c line 1786
  • #18 object_set_property
    at gobject.c line 1199
  • #19 g_object_set_valist
    at gobject.c line 1727
  • #20 g_object_set
    at gobject.c line 1833
  • #21 gtk_scrolled_window_remove
    at gtkscrolledwindow.c line 1997
  • #22 Gtk::Container_Class::remove_callback
    at container.cc line 168
  • #23 g_cclosure_marshal_VOID__OBJECT
    at gmarshal.c line 644
  • #24 g_type_class_meta_marshal
  • #25 g_closure_invoke
    at gclosure.c line 774
  • #26 signal_emit_unlocked_R
    at gsignal.c line 3202
  • #27 g_signal_emit_valist
    at gsignal.c line 3003
  • #28 g_signal_emit
    at gsignal.c line 3060
  • #29 gtk_container_remove
    at gtkcontainer.c line 1539
  • #30 gtk_widget_dispose
    at gtkwidget.c line 10655
  • #31 Gtk::Widget_Class::dispose_vfunc_callback
    at widget.cc line 595
  • #32 g_object_run_dispose
    at gobject.c line 945
  • #33 Gtk::Object::_release_c_instance
    at object.cc line 148
  • #34 Gtk::Object::destroy_
    at object.cc line 260
  • #35 Gtk::TreeView::~TreeView
    at treeview.cc line 1137
  • #36 Glom::DbAddDel::~DbAddDel
    at glom/mode_data/db_adddel/db_adddel.cc line 115
  • #37 Glom::DbAddDel_WithButtons::~DbAddDel_WithButtons
    at glom/mode_data/db_adddel/db_adddel_withbuttons.cc line 53
  • #38 Glom::Box_Data_List::~Box_Data_List
    at glom/mode_data/box_data_list.cc line 66
  • #39 Glom::DataWidgetChildren::Dialog_ChooseID::~Dialog_ChooseID
    at glom/mode_data/datawidget/dialog_choose_id.cc line 71
  • #40 Glom::DataWidgetChildren::Dialog_ChooseID::~Dialog_ChooseID
    at glom/mode_data/datawidget/dialog_choose_id.cc line 75
  • #41 Glom::DataWidget::offer_related_record_id_find
    at glom/mode_data/datawidget/datawidget.cc line 661
  • #42 Glom::DataWidget::on_button_select_id
    at glom/mode_data/datawidget/datawidget.cc line 578
  • #43 sigc::bound_mem_functor0<void, Glom::DataWidget>::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/mem_fun.h line 1787
  • #44 sigc::adaptor_functor<sigc::bound_mem_functor0<void, Glom::DataWidget> >::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/adaptors/adaptor_trait.h line 251
  • #45 sigc::internal::slot_call0<sigc::bound_mem_functor0<void, Glom::DataWidget>, void>::call_it
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/slot.h line 103
  • #46 sigc::slot0<void>::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/slot.h line 440
  • #47 Glib::SignalProxyNormal::slot0_void_callback
    at signalproxy.cc line 95
  • #48 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #49 g_closure_invoke
  • #50 signal_emit_unlocked_R
    at gsignal.c line 3342
  • #51 g_signal_emit_valist
    at gsignal.c line 3003
  • #52 g_signal_emit
    at gsignal.c line 3060
  • #53 gtk_button_clicked
    at gtkbutton.c line 1197
  • #54 gtk_real_button_released
    at gtkbutton.c line 1826
  • #55 Gtk::Button_Class::released_callback
    at button.cc line 240
  • #56 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #57 g_type_class_meta_marshal
    at gclosure.c line 885
  • #58 g_closure_invoke
    at gclosure.c line 774
  • #59 signal_emit_unlocked_R
    at gsignal.c line 3202
  • #60 g_signal_emit_valist
    at gsignal.c line 3003
  • #61 g_signal_emit
    at gsignal.c line 3060
  • #62 gtk_button_released
    at gtkbutton.c line 1183
  • #63 gtk_button_button_release
    at gtkbutton.c line 1718
  • #64 Gtk::Widget_Class::button_release_event_callback
    at widget.cc line 4449
  • #65 _gtk_marshal_BOOLEAN__BOXED
    at gtkmarshalers.c line 85
  • #66 g_type_class_meta_marshal
    at gclosure.c line 885
  • #67 g_closure_invoke
    at gclosure.c line 774
  • #68 signal_emit_unlocked_R
    at gsignal.c line 3310
  • #69 g_signal_emit_valist
    at gsignal.c line 3013
  • #70 g_signal_emit
    at gsignal.c line 3060
  • #71 gtk_widget_event_internal
    at gtkwidget.c line 6132
  • #72 gtk_widget_event
    at gtkwidget.c line 5848
  • #73 gtk_propagate_event
    at gtkmain.c line 2614
  • #74 gtk_main_do_event
    at gtkmain.c line 1889
  • #75 _gdk_event_emit
    at gdkevents.c line 71
  • #76 gdk_event_source_dispatch
    at gdkeventsource.c line 360
  • #77 g_main_dispatch
    at gmain.c line 2441
  • #78 g_main_context_dispatch
    at gmain.c line 3011
  • #79 g_main_context_iterate
    at gmain.c line 3089
  • #80 g_main_loop_run
    at gmain.c line 3297
  • #81 gtk_main
    at gtkmain.c line 1362
  • #82 Gtk::Main::run_impl
    at main.cc line 420
  • #83 Gtk::Main::run
    at main.cc line 384
  • #84 main
    at glom/main.cc line 613

Comment 2 Murray Cumming 2011-09-28 11:42:21 UTC
If I call remove_all_columns() in the DbAddDel descructor, I get this backtrace at the first warning:

Breakpoint 1, g_log (log_domain=0x15aafb6 "glibmm", log_level=G_LOG_LEVEL_WARNING, 
    format=0x15aafc0 "Glib::wrap_create_new_wrapper: Attempted to create a 2nd C++ wrapper for a C instance whose C++ wrapper has been deleted.") at gmessages.c:590
590	  va_start (args, format);
(gdb) bt
  • #0 g_log
    at gmessages.c line 590
  • #1 Glib::wrap_create_new_wrapper
    at wrap.cc line 102
  • #2 Glib::wrap_auto
    at wrap.cc line 187
  • #3 Glib::wrap
    at widget.cc line 3354
  • #4 Gtk::CellRenderer_Class::get_preferred_width_vfunc_callback
    at cellrenderer.cc line 63
  • #5 gtk_cell_renderer_get_preferred_width
    at gtkcellrenderer.c line 1414
  • #6 gtk_cell_area_request_renderer
    at gtkcellarea.c line 3590
  • #7 compute_size
    at gtkcellareabox.c line 1533
  • #8 gtk_cell_area_box_get_preferred_width
    at gtkcellareabox.c line 1822
  • #9 gtk_cell_area_get_preferred_width
    at gtkcellarea.c line 2096
  • #10 gtk_tree_view_column_cell_get_size
    at gtktreeviewcolumn.c line 2899
  • #11 validate_row
    at gtktreeview.c line 6088
  • #12 validate_visible_area
    at gtktreeview.c line 6301
  • #13 do_presize_handler
    at gtktreeview.c line 6768
  • #14 gtk_tree_view_bin_process_updates
    at gtktreeview.c line 6823
  • #15 gtk_tree_view_adjustment_changed
    at gtktreeview.c line 11266
  • #16 gtk_tree_view_set_hadjustment
    at gtktreeview.c line 11550
  • #17 gtk_tree_view_set_property
    at gtktreeview.c line 1786
  • #18 object_set_property
    at gobject.c line 1199
  • #19 g_object_set_valist
    at gobject.c line 1727
  • #20 g_object_set
    at gobject.c line 1833
  • #21 gtk_scrolled_window_remove
    at gtkscrolledwindow.c line 1997
  • #22 Gtk::Container_Class::remove_callback
    at container.cc line 168
  • #23 g_cclosure_marshal_VOID__OBJECT
    at gmarshal.c line 644
  • #24 g_type_class_meta_marshal
  • #25 g_closure_invoke
    at gclosure.c line 774
  • #26 signal_emit_unlocked_R
    at gsignal.c line 3202
  • #27 g_signal_emit_valist
    at gsignal.c line 3003
  • #28 g_signal_emit
    at gsignal.c line 3060
  • #29 gtk_container_remove
    at gtkcontainer.c line 1539
  • #30 gtk_widget_dispose
    at gtkwidget.c line 10655
  • #31 Gtk::Widget_Class::dispose_vfunc_callback
    at widget.cc line 595
  • #32 g_object_run_dispose
    at gobject.c line 945
  • #33 Gtk::Object::_release_c_instance
    at object.cc line 148
  • #34 Gtk::Object::destroy_
    at object.cc line 260
  • #35 Gtk::TreeView::~TreeView
    at treeview.cc line 1137
  • #36 Glom::DbAddDel::~DbAddDel
    at glom/mode_data/db_adddel/db_adddel.cc line 115
  • #37 Glom::DbAddDel_WithButtons::~DbAddDel_WithButtons
    at glom/mode_data/db_adddel/db_adddel_withbuttons.cc line 53
  • #38 Glom::Box_Data_List::~Box_Data_List
    at glom/mode_data/box_data_list.cc line 66
  • #39 Glom::DataWidgetChildren::Dialog_ChooseID::~Dialog_ChooseID
    at glom/mode_data/datawidget/dialog_choose_id.cc line 71
  • #40 Glom::DataWidgetChildren::Dialog_ChooseID::~Dialog_ChooseID
    at glom/mode_data/datawidget/dialog_choose_id.cc line 75
  • #41 Glom::DataWidget::offer_related_record_id_find
    at glom/mode_data/datawidget/datawidget.cc line 661
  • #42 Glom::DataWidget::on_button_select_id
    at glom/mode_data/datawidget/datawidget.cc line 578
  • #43 sigc::bound_mem_functor0<void, Glom::DataWidget>::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/mem_fun.h line 1787
  • #44 sigc::adaptor_functor<sigc::bound_mem_functor0<void, Glom::DataWidget> >::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/adaptors/adaptor_trait.h line 251
  • #45 sigc::internal::slot_call0<sigc::bound_mem_functor0<void, Glom::DataWidget>, void>::call_it
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/slot.h line 103
  • #46 sigc::slot0<void>::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/slot.h line 440
  • #47 Glib::SignalProxyNormal::slot0_void_callback
    at signalproxy.cc line 95
  • #48 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #49 g_closure_invoke
  • #50 signal_emit_unlocked_R
    at gsignal.c line 3342
  • #51 g_signal_emit_valist
    at gsignal.c line 3003
  • #52 g_signal_emit
    at gsignal.c line 3060
  • #53 gtk_button_clicked
    at gtkbutton.c line 1197
  • #54 gtk_real_button_released
    at gtkbutton.c line 1826
  • #55 Gtk::Button_Class::released_callback
    at button.cc line 240
  • #56 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #57 g_type_class_meta_marshal
    at gclosure.c line 885
  • #58 g_closure_invoke
    at gclosure.c line 774
  • #59 signal_emit_unlocked_R
    at gsignal.c line 3202
  • #60 g_signal_emit_valist
    at gsignal.c line 3003
  • #61 g_signal_emit
    at gsignal.c line 3060
  • #62 gtk_button_released
    at gtkbutton.c line 1183
  • #63 gtk_button_button_release
    at gtkbutton.c line 1718
  • #64 Gtk::Widget_Class::button_release_event_callback
    at widget.cc line 4449
  • #65 _gtk_marshal_BOOLEAN__BOXED
    at gtkmarshalers.c line 85
  • #66 g_type_class_meta_marshal
    at gclosure.c line 885
  • #67 g_closure_invoke
    at gclosure.c line 774
  • #68 signal_emit_unlocked_R
    at gsignal.c line 3310
  • #69 g_signal_emit_valist
    at gsignal.c line 3013
  • #70 g_signal_emit
    at gsignal.c line 3060
  • #71 gtk_widget_event_internal
    at gtkwidget.c line 6132
  • #72 gtk_widget_event
    at gtkwidget.c line 5848
  • #73 gtk_propagate_event
    at gtkmain.c line 2614
  • #74 gtk_main_do_event
    at gtkmain.c line 1889
  • #75 _gdk_event_emit
    at gdkevents.c line 71
  • #76 gdk_event_source_dispatch
    at gdkeventsource.c line 360
  • #77 g_main_dispatch
    at gmain.c line 2441
  • #78 g_main_context_dispatch
    at gmain.c line 3011
  • #79 g_main_context_iterate
    at gmain.c line 3089
  • #80 g_main_loop_run
    at gmain.c line 3297
  • #81 gtk_main
    at gtkmain.c line 1362
  • #82 Gtk::Main::run_impl
    at main.cc line 420
  • #83 Gtk::Main::run
    at main.cc line 384
  • #84 main
    at glom/main.cc line 613

Comment 3 Murray Cumming 2011-09-28 11:52:39 UTC
If I do remove_all_columns in the Gtk::TreeView destructor, I get this warning

(glom:763): Gtk-CRITICAL **: gtk_tree_view_get_cell_area: assertion `column == NULL || GTK_IS_TREE_VIEW_COLUMN (column)' failed

with this backtrace at at that point:

Breakpoint 1, g_log (log_domain=0x1a9936f "Gtk", log_level=G_LOG_LEVEL_CRITICAL, 
    format=0x233755c "%s: assertion `%s' failed") at gmessages.c:590
590	  va_start (args, format);
(gdb) bt
  • #0 g_log
    at gmessages.c line 590
  • #1 g_return_if_fail_warning
  • #2 gtk_tree_view_get_cell_area
    at gtktreeview.c line 13556
  • #3 set_cell_visibility
    at gtktreeviewaccessible.c line 2284
  • #4 traverse_cells
    at gtktreeviewaccessible.c line 2929
  • #5 columns_changed
    at gtktreeviewaccessible.c line 1768
  • #6 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #7 g_closure_invoke
    at gclosure.c line 774
  • #8 signal_emit_unlocked_R
    at gsignal.c line 3272
  • #9 g_signal_emit_valist
    at gsignal.c line 3003
  • #10 g_signal_emit
    at gsignal.c line 3060
  • #11 gtk_tree_view_remove_column
    at gtktreeview.c line 11943
  • #12 Gtk::TreeView::remove_column
    at treeview.cc line 1257
  • #13 Gtk::TreeView::remove_all_columns
    at treeview.cc line 316
  • #14 Gtk::TreeView::~TreeView
    at treeview.cc line 1137
  • #15 Glom::DbAddDel::~DbAddDel
    at glom/mode_data/db_adddel/db_adddel.cc line 115
  • #16 Glom::DbAddDel_WithButtons::~DbAddDel_WithButtons
    at glom/mode_data/db_adddel/db_adddel_withbuttons.cc line 53
  • #17 Glom::Box_Data_List::~Box_Data_List
    at glom/mode_data/box_data_list.cc line 66
  • #18 Glom::DataWidgetChildren::Dialog_ChooseID::~Dialog_ChooseID
    at glom/mode_data/datawidget/dialog_choose_id.cc line 71
  • #19 Glom::DataWidgetChildren::Dialog_ChooseID::~Dialog_ChooseID
    at glom/mode_data/datawidget/dialog_choose_id.cc line 75
  • #20 Glom::DataWidget::offer_related_record_id_find
    at glom/mode_data/datawidget/datawidget.cc line 661
  • #21 Glom::DataWidget::on_button_select_id
    at glom/mode_data/datawidget/datawidget.cc line 578
  • #22 sigc::bound_mem_functor0<void, Glom::DataWidget>::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/mem_fun.h line 1787
  • #23 sigc::adaptor_functor<sigc::bound_mem_functor0<void, Glom::DataWidget> >::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/adaptors/adaptor_trait.h line 251
  • #24 sigc::internal::slot_call0<sigc::bound_mem_functor0<void, Glom::DataWidget>, void>::call_it
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/slot.h line 103
  • #25 sigc::slot0<void>::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/slot.h line 440
  • #26 Glib::SignalProxyNormal::slot0_void_callback
    at signalproxy.cc line 95
  • #27 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #28 g_closure_invoke
    at gclosure.c line 774
  • #29 signal_emit_unlocked_R
    at gsignal.c line 3342
  • #30 g_signal_emit_valist
    at gsignal.c line 3003
  • #31 g_signal_emit
    at gsignal.c line 3060
  • #32 gtk_button_clicked
    at gtkbutton.c line 1197
  • #33 gtk_real_button_released
    at gtkbutton.c line 1826
  • #34 Gtk::Button_Class::released_callback
    at button.cc line 240
  • #35 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #36 g_type_class_meta_marshal
    at gclosure.c line 885
  • #37 g_closure_invoke
    at gclosure.c line 774
  • #38 signal_emit_unlocked_R
    at gsignal.c line 3202
  • #39 g_signal_emit_valist
    at gsignal.c line 3003
  • #40 g_signal_emit
    at gsignal.c line 3060
  • #41 gtk_button_released
    at gtkbutton.c line 1183
  • #42 gtk_button_button_release
    at gtkbutton.c line 1718
  • #43 Gtk::Widget_Class::button_release_event_callback
    at widget.cc line 4449
  • #44 _gtk_marshal_BOOLEAN__BOXED
    at gtkmarshalers.c line 85
  • #45 g_type_class_meta_marshal
    at gclosure.c line 885
  • #46 g_closure_invoke
    at gclosure.c line 774
  • #47 signal_emit_unlocked_R
    at gsignal.c line 3310
  • #48 g_signal_emit_valist
    at gsignal.c line 3013
  • #49 g_signal_emit
    at gsignal.c line 3060
  • #50 gtk_widget_event_internal
    at gtkwidget.c line 6132
  • #51 gtk_widget_event
    at gtkwidget.c line 5848
  • #52 gtk_propagate_event
    at gtkmain.c line 2614
  • #53 gtk_main_do_event
    at gtkmain.c line 1889
  • #54 _gdk_event_emit
    at gdkevents.c line 71
  • #55 gdk_event_source_dispatch
    at gdkeventsource.c line 360
  • #56 g_main_dispatch
    at gmain.c line 2441
  • #57 g_main_context_dispatch
    at gmain.c line 3011
  • #58 g_main_context_iterate
    at gmain.c line 3089
  • #59 g_main_loop_run
    at gmain.c line 3297
  • #60 gtk_main
    at gtkmain.c line 1362
  • #61 Gtk::Main::run_impl
    at main.cc line 420
  • #62 Gtk::Main::run
    at main.cc line 384
  • #63 main
    at glom/main.cc line 613

Comment 4 Murray Cumming 2011-09-29 07:56:22 UTC
Created attachment 197731 [details] [review]
#include <giomm/file.h>

This patch adds a simpler use of the dialog to tests/test_selfhosting_new_from_example. Just do 
  make ./tests/test_selfhosting_new_from_example 
to build only that test.

This is not suitable for pushing because it requires user interaction in the test.

It shows the same problem.
Comment 5 Murray Cumming 2011-09-29 09:36:51 UTC
Created attachment 197739 [details] [review]
test_dialog_choose_id3.patch

This patch rips out most of the dialog and makes the test case non-interactive, via a 2-second timeout to cancel the dialog. It still shows the problem.
Comment 6 Murray Cumming 2011-09-29 10:21:22 UTC
This commit works around the crash in Glom, though it would be good to fix it properly because it will probably happen somewhere else.
http://git.gnome.org/browse/glom/commit/?id=5cf223201ece3534ab177e7eaaa75322542e8bec
Comment 7 Krzesimir Nowak 2011-10-05 10:39:12 UTC
(In reply to comment #2)
> If I call remove_all_columns() in the DbAddDel descructor, I get this backtrace
> at the first warning:

Note that remove_all_columns() call in DbAddDel destructor calls in fact DbAddDel::remove_all_columns() which has nothing in common with Gtk::TreeView::remove_all_columns().

(In reply to comment #3)
> If I do remove_all_columns in the Gtk::TreeView destructor, I get this warning
> 
> (glom:763): Gtk-CRITICAL **: gtk_tree_view_get_cell_area: assertion `column ==
> NULL || GTK_IS_TREE_VIEW_COLUMN (column)' failed
> 
> with this backtrace at at that point:

And this is IMO a bug in GtkTreeViewAccessible: static void columns_changed (GtkTreeView *tree_view) improperly detects a remove of column as a some kind of move and then refers to removed column, which have ref_count 0 at this point.

This warning does not appear if you remove columns from the end. That is - if below code is used in DbAddDel destructor no warning shows:

(It is similar to Gtk::TreeView::remove_all_columns, but I used reverse iterators here.)

typedef std::vector<Gtk::TreeView::Column*> type_vecViewColumns;
type_vecViewColumns vecViewColumns (m_TreeView.get_columns());

for (type_vecViewColumns::reverse_iterator iter (vecViewColumns.rbegin ()),
     columns_end (vecViewColumns.rend ());
     iter != columns_end;
     ++iter)
{
  Gtk::TreeView::Column* pViewColumn (*iter);

  if(pViewColumn)
  {
    m_TreeView.remove_column(*pViewColumn);
  }
}

I wonder if this could be reproducible with C example.
Comment 8 Murray Cumming 2011-10-15 19:54:25 UTC
Closing because we now have a workaround, and the real problem is being dealt with in GTK+ bug #661058 .
Comment 9 Murray Cumming 2011-11-30 11:44:01 UTC
Bug #661058 was apparently fixed, but if I remove the workaround, I still see a crash. Here is the backtrace:

Program received signal SIGSEGV, Segmentation fault.
0x08295cb6 in Gtk::Widget::gobj (this=0x0) at /opt/gnome30/include/gtkmm-3.0/gtkmm/widget.h:289
289	  GtkWidget*       gobj()       { return reinterpret_cast<GtkWidget*>(gobject_); }
(gdb) bt
  • #0 Gtk::Widget::gobj
    at /opt/gnome30/include/gtkmm-3.0/gtkmm/widget.h line 289
  • #1 Gtk::CellRenderer::get_preferred_width_vfunc
    at cellrenderer.cc line 1040
  • #2 Gtk::CellRenderer_Class::get_preferred_width_vfunc_callback
    at cellrenderer.cc line 68
  • #3 gtk_cell_renderer_get_preferred_width
    at gtkcellrenderer.c line 1414
  • #4 gtk_cell_area_request_renderer
    at gtkcellarea.c line 3600
  • #5 compute_size
    at gtkcellareabox.c line 1533
  • #6 gtk_cell_area_box_get_preferred_width
    at gtkcellareabox.c line 1822
  • #7 gtk_cell_area_get_preferred_width
    at gtkcellarea.c line 2096
  • #8 gtk_tree_view_column_cell_get_size
    at gtktreeviewcolumn.c line 2908
  • #9 validate_row
    at gtktreeview.c line 6099
  • #10 validate_visible_area
    at gtktreeview.c line 6312
  • #11 do_presize_handler
    at gtktreeview.c line 6775
  • #12 gtk_tree_view_bin_process_updates
    at gtktreeview.c line 6830
  • #13 gtk_tree_view_adjustment_changed
    at gtktreeview.c line 11264
  • #14 gtk_tree_view_do_set_hadjustment
    at gtktreeview.c line 11564
  • #15 gtk_tree_view_set_property
    at gtktreeview.c line 1787
  • #16 object_set_property
    at gobject.c line 1331
  • #17 g_object_set_valist
    at gobject.c line 1863
  • #18 g_object_set
    at gobject.c line 1969
  • #19 gtk_scrolled_window_remove
    at gtkscrolledwindow.c line 1999
  • #20 Gtk::Container_Class::remove_callback
    at container.cc line 171
  • #21 g_cclosure_marshal_VOID__OBJECT
    at gmarshal.c line 644
  • #22 g_type_class_meta_marshal
    at gclosure.c line 885
  • #23 g_closure_invoke
    at gclosure.c line 774
  • #24 signal_emit_unlocked_R
    at gsignal.c line 3232
  • #25 g_signal_emit_valist
    at gsignal.c line 3033
  • #26 g_signal_emit
    at gsignal.c line 3090
  • #27 gtk_container_remove
    at gtkcontainer.c line 1539
  • #28 gtk_widget_dispose
    at gtkwidget.c line 10061
  • #29 Gtk::Widget_Class::dispose_vfunc_callback
    at widget.cc line 601
  • #30 g_object_run_dispose
    at gobject.c line 1040
  • #31 Gtk::Object::_release_c_instance
    at object.cc line 148
  • #32 Gtk::Object::destroy_
    at object.cc line 260
  • #33 Gtk::TreeView::~TreeView
    at treeview.cc line 1140
  • #34 Glom::DbAddDel::~DbAddDel
    at glom/mode_data/db_adddel/db_adddel.cc line 126
  • #35 Glom::DbAddDel_WithButtons::~DbAddDel_WithButtons
    at glom/mode_data/db_adddel/db_adddel_withbuttons.cc line 55
  • #36 Glom::Box_Data_List::~Box_Data_List
    at glom/mode_data/box_data_list.cc line 66
  • #37 Glom::DataWidgetChildren::Dialog_ChooseID::~Dialog_ChooseID
    at glom/mode_data/datawidget/dialog_choose_id.cc line 71
  • #38 Glom::DataWidgetChildren::Dialog_ChooseID::~Dialog_ChooseID
    at glom/mode_data/datawidget/dialog_choose_id.cc line 79
  • #39 Glom::DataWidget::offer_related_record_id_find
    at glom/mode_data/datawidget/datawidget.cc line 665
  • #40 Glom::DataWidget::on_button_select_id
    at glom/mode_data/datawidget/datawidget.cc line 582
  • #41 sigc::bound_mem_functor0<void, Glom::DataWidget>::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/mem_fun.h line 1787
  • #42 sigc::adaptor_functor<sigc::bound_mem_functor0<void, Glom::DataWidget> >::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/adaptors/adaptor_trait.h line 251
  • #43 sigc::internal::slot_call0<sigc::bound_mem_functor0<void, Glom::DataWidget>, void>::call_it
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/slot.h line 103
  • #44 sigc::slot0<void>::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/slot.h line 440
  • #45 Glib::SignalProxyNormal::slot0_void_callback
    at signalproxy.cc line 95
  • #46 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #47 g_closure_invoke
    at gclosure.c line 774
  • #48 signal_emit_unlocked_R
    at gsignal.c line 3372
  • #49 g_signal_emit_valist
    at gsignal.c line 3033
  • #50 g_signal_emit
    at gsignal.c line 3090
  • #51 gtk_button_clicked
    at gtkbutton.c line 1197
  • #52 gtk_real_button_released
    at gtkbutton.c line 1826
  • #53 Gtk::Button_Class::released_callback
    at button.cc line 243
  • #54 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #55 g_type_class_meta_marshal
    at gclosure.c line 885
  • #56 g_closure_invoke
    at gclosure.c line 774
  • #57 signal_emit_unlocked_R
    at gsignal.c line 3232
  • #58 g_signal_emit_valist
    at gsignal.c line 3033
  • #59 g_signal_emit
    at gsignal.c line 3090
  • #60 gtk_button_button_release
    at gtkbutton.c line 1718
  • #61 Gtk::Widget_Class::button_release_event_callback
    at widget.cc line 4455
  • #62 _gtk_marshal_BOOLEAN__BOXED
    at gtkmarshalers.c line 85
  • #63 g_type_class_meta_marshal
  • #64 g_closure_invoke
    at gclosure.c line 774
  • #65 signal_emit_unlocked_R
    at gsignal.c line 3340
  • #66 g_signal_emit_valist
    at gsignal.c line 3043
  • #67 g_signal_emit
    at gsignal.c line 3090
  • #68 gtk_widget_event_internal
    at gtkwidget.c line 6129
  • #69 gtk_widget_event
    at gtkwidget.c line 5845
  • #70 gtk_propagate_event
    at gtkmain.c line 2411
  • #71 gtk_main_do_event
    at gtkmain.c line 1686
  • #72 _gdk_event_emit
    at gdkevents.c line 71
  • #73 gdk_event_source_dispatch
    at gdkeventsource.c line 360
  • #74 g_main_dispatch
    at gmain.c line 2513
  • #75 g_main_context_dispatch
    at gmain.c line 3050
  • #76 g_main_context_iterate
    at gmain.c line 3121
  • #77 g_main_loop_run
    at gmain.c line 3315
  • #78 gtk_main
    at gtkmain.c line 1159
  • #79 Gtk::Main::run_impl
    at main.cc line 423
  • #80 Gtk::Main::run
    at main.cc line 387
  • #81 main
    at glom/main.cc line 629

Comment 10 Murray Cumming 2011-11-30 11:44:39 UTC
This time I see these warnings:

glibmm-WARNING **: Glib::wrap_create_new_wrapper: Attempted to create a 2nd C++ wrapper for a C instance whose C++ wrapper has been deleted.

glibmm-WARNING **: Failed to wrap object of type 'gtkmm__GtkTreeView'. Hint: this error is commonly caused by failing to call a library init() function.
Comment 11 Murray Cumming 2011-11-30 11:51:17 UTC
And this is the valgrind output at that point:

==27575== Invalid read of size 4
==27575==    at 0x8295CB6: Gtk::Widget::gobj() (widget.h:289)
==27575==    by 0x5059E23: Gtk::CellRenderer::get_preferred_width_vfunc(Gtk::Widget&, int&, int&) const (cellrenderer.cc:1040)
==27575==    by 0x50576DA: Gtk::CellRenderer_Class::get_preferred_width_vfunc_callback(_GtkCellRenderer*, _GtkWidget*, int*, int*) (cellrenderer.cc:68)
==27575==    by 0x5659BC2: gtk_cell_renderer_get_preferred_width (gtkcellrenderer.c:1414)
==27575==    by 0x564DF1A: gtk_cell_area_request_renderer (gtkcellarea.c:3600)
==27575==    by 0x5650926: compute_size (gtkcellareabox.c:1533)
==27575==    by 0x565121D: gtk_cell_area_box_get_preferred_width (gtkcellareabox.c:1822)
==27575==    by 0x5649CB9: gtk_cell_area_get_preferred_width (gtkcellarea.c:2096)
==27575==    by 0x58B94F5: gtk_tree_view_column_cell_get_size (gtktreeviewcolumn.c:2908)
==27575==    by 0x589D151: validate_row (gtktreeview.c:6099)
==27575==    by 0x589DAA1: validate_visible_area (gtktreeview.c:6312)
==27575==    by 0x589EC00: do_presize_handler (gtktreeview.c:6775)
==27575==    by 0x589EE5B: gtk_tree_view_bin_process_updates (gtktreeview.c:6830)
==27575==    by 0x58A7FB7: gtk_tree_view_adjustment_changed (gtktreeview.c:11264)
==27575==    by 0x58A8C16: gtk_tree_view_do_set_hadjustment (gtktreeview.c:11564)
==27575==    by 0x5892717: gtk_tree_view_set_property (gtktreeview.c:1787)
==27575==    by 0x5E6D098: object_set_property (gobject.c:1331)
==27575==    by 0x5E6E3BB: g_object_set_valist (gobject.c:1863)
==27575==    by 0x5E6E866: g_object_set (gobject.c:1969)
==27575==    by 0x57C6A9D: gtk_scrolled_window_remove (gtkscrolledwindow.c:1999)
==27575==    by 0x5072A28: Gtk::Container_Class::remove_callback(_GtkContainer*, _GtkWidget*) (container.cc:171)
==27575==    by 0x5E6A80D: g_cclosure_marshal_VOID__OBJECT (gmarshal.c:644)
==27575==    by 0x5E6833B: g_type_class_meta_marshal (gclosure.c:885)
==27575==    by 0x5E68034: g_closure_invoke (gclosure.c:774)
==27575==    by 0x5E7F944: signal_emit_unlocked_R (gsignal.c:3232)
==27575==    by 0x5E7F1CB: g_signal_emit_valist (gsignal.c:3033)
==27575==    by 0x5E7F4AA: g_signal_emit (gsignal.c:3090)
==27575==    by 0x5686E71: gtk_container_remove (gtkcontainer.c:1539)
==27575==    by 0x58D7494: gtk_widget_dispose (gtkwidget.c:10061)
==27575==    by 0x5138187: Gtk::Widget_Class::dispose_vfunc_callback(_GObject*) (widget.cc:601)
==27575==    by 0x5E6C7FC: g_object_run_dispose (gobject.c:1040)
==27575==    by 0x51677F2: Gtk::Object::_release_c_instance() (object.cc:148)
==27575==    by 0x5167C73: Gtk::Object::destroy_() (object.cc:260)
==27575==    by 0x512AB6F: Gtk::TreeView::~TreeView() (treeview.cc:1140)
==27575==    by 0x82F0D34: Glom::DbAddDel::~DbAddDel() (db_adddel.cc:126)
==27575==    by 0x831D832: Glom::DbAddDel_WithButtons::~DbAddDel_WithButtons() (db_adddel_withbuttons.cc:55)
==27575==    by 0x82C1948: Glom::Box_Data_List::~Box_Data_List() (box_data_list.cc:66)
==27575==    by 0x8396757: Glom::DataWidgetChildren::Dialog_ChooseID::~Dialog_ChooseID() (dialog_choose_id.cc:71)
==27575==    by 0x8396D10: Glom::DataWidgetChildren::Dialog_ChooseID::~Dialog_ChooseID() (dialog_choose_id.cc:79)
==27575==    by 0x8371100: Glom::DataWidget::offer_related_record_id_find(Gnome::Gda::Value&) (datawidget.cc:665)
==27575==    by 0x8370007: Glom::DataWidget::on_button_select_id() (datawidget.cc:582)
==27575==    by 0x837729E: sigc::bound_mem_functor0<void, Glom::DataWidget>::operator()() const (in /opt/gnome30/bin/glom)
==27575==    by 0x8376ECB: sigc::adaptor_functor<sigc::bound_mem_functor0<void, Glom::DataWidget> >::operator()() const (adaptor_trait.h:251)
==27575==    by 0x83768A3: sigc::internal::slot_call0<sigc::bound_mem_functor0<void, Glom::DataWidget>, void>::call_it(sigc::internal::slot_rep*) (slot.h:103)
==27575==    by 0x4141819: sigc::slot0<void>::operator()() const (slot.h:440)
==27575==    by 0x551CBA2: Glib::SignalProxyNormal::slot0_void_callback(_GObject*, void*) (signalproxy.cc:95)
==27575==    by 0x5E69CE7: g_cclosure_marshal_VOID__VOID (gmarshal.c:85)
==27575==    by 0x5E68034: g_closure_invoke (gclosure.c:774)
==27575==    by 0x5E7FE52: signal_emit_unlocked_R (gsignal.c:3372)
==27575==    by 0x5E7F1CB: g_signal_emit_valist (gsignal.c:3033)
==27575==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
Comment 12 Murray Cumming 2011-11-30 11:52:13 UTC
This patch brings the crash back:

--- a/glom/mode_data/datawidget/dialog_choose_id.cc
+++ b/glom/mode_data/datawidget/dialog_choose_id.cc
@@ -75,7 +75,7 @@ Dialog_ChooseID::~Dialog_ChooseID()
   
   //Work around this bug (apparently in GTK+):
   //https://bugzilla.gnome.org/show_bug.cgi?id=660347
-  m_alignment_parent->remove();
+  //m_alignment_parent->remove();
 }
Comment 13 Krzesimir Nowak 2011-11-30 14:15:49 UTC
The bug I fixed seemingly fixed the other thing...

I don't know where exactly problem lies:
1. is it on C++ side that it deletes a wrapper at the beginning of dispose instead of its end.
2. is it on C side in general, because ideally all children of to-be-destroyed widget should be marked to-be-destroyed too, so no superfluous calls could be done.

If I remember correctly - here specifically GtkScrolledWindow unsets some adjustments of its child and that makes that child wanting to redraw itself. So it calls some vfuncs which are in fact some methods of already destroyed C++ wrapper.
Comment 14 Krzesimir Nowak 2011-12-03 15:09:55 UTC
Created attachment 202706 [details] [review]
Scrolledwindow: unset adjustments after removal, not before.

Please either provide a way to reproduce it or a patch like the one from comment 5 (the current one does not apply now).

In the meantime, please try patching gtk+ with attached patch. Note that it is untested at all, because I had some problems with running glom (something about glom python module not being installed).
Comment 15 Murray Cumming 2011-12-05 16:39:18 UTC
Yes, that fixes the crash. I guess you should submit that as a GTK+ bug.
Comment 16 Krzesimir Nowak 2011-12-06 09:31:11 UTC
Filed a Gtk+ bug and added a dependency.
Comment 17 Murray Cumming 2012-02-10 16:43:03 UTC
The workaround in comment #12 still seems to be necessary.

Before glom crashes, I now see this warning (actually twice):

glibmm-WARNING **: Glib::wrap_create_new_wrapper: Attempted to create a 2nd C++ wrapper for a C instance whose C++ wrapper has been deleted.


Here is the gdb backtrace at that point:

  • #0 g_log
    at gmessages.c line 791
  • #1 Glib::wrap_create_new_wrapper
    at wrap.cc line 102
  • #2 Glib::wrap_auto
    at wrap.cc line 187
  • #3 Glib::wrap
    at widget.cc line 3360
  • #4 Gtk::CellRenderer_Class::get_preferred_width_vfunc_callback
    at cellrenderer.cc line 66
  • #5 gtk_cell_renderer_get_preferred_width
    at gtkcellrenderer.c line 1465
  • #6 gtk_cell_area_request_renderer
    at gtkcellarea.c line 3600
  • #7 compute_size
    at gtkcellareabox.c line 1533
  • #8 gtk_cell_area_box_get_preferred_width
    at gtkcellareabox.c line 1822
  • #9 gtk_cell_area_get_preferred_width
    at gtkcellarea.c line 2096
  • #10 gtk_tree_view_column_cell_get_size
    at gtktreeviewcolumn.c line 2908
  • #11 validate_row
    at gtktreeview.c line 6082
  • #12 validate_visible_area
    at gtktreeview.c line 6295
  • #13 do_presize_handler
    at gtktreeview.c line 6758
  • #14 gtk_tree_view_bin_process_updates
    at gtktreeview.c line 6813
  • #15 gtk_tree_view_adjustment_changed
    at gtktreeview.c line 11268
  • #16 gtk_tree_view_do_set_hadjustment
    at gtktreeview.c line 11569
  • #17 gtk_tree_view_set_property
    at gtktreeview.c line 1793
  • #18 object_set_property
    at gobject.c line 1342
  • #19 g_object_set_valist
    at gobject.c line 1937
  • #20 g_object_set
    at gobject.c line 2043
  • #21 gtk_scrolled_window_remove
    at gtkscrolledwindow.c line 2003
  • #22 Gtk::Container_Class::remove_callback
    at container.cc line 171
  • #23 g_cclosure_marshal_VOID__OBJECT
    at gmarshal.c line 644
  • #24 g_type_class_meta_marshal
    at gclosure.c line 885
  • #25 g_closure_invoke
    at gclosure.c line 774
  • #26 signal_emit_unlocked_R
    at gsignal.c line 3232
  • #27 g_signal_emit_valist
    at gsignal.c line 3033
  • #28 g_signal_emit
    at gsignal.c line 3090
  • #29 gtk_container_remove
    at gtkcontainer.c line 1539
  • #30 gtk_widget_dispose
    at gtkwidget.c line 10101
  • #31 Gtk::Widget_Class::dispose_vfunc_callback
    at widget.cc line 601
  • #32 g_object_run_dispose
    at gobject.c line 1051
  • #33 Gtk::Object::_release_c_instance
    at object.cc line 148
  • #34 Gtk::Object::destroy_
    at object.cc line 260
  • #35 Gtk::TreeView::~TreeView
    at treeview.cc line 1140
  • #36 Glom::DbAddDel::~DbAddDel
    at glom/mode_data/db_adddel/db_adddel.cc line 126
  • #37 Glom::DbAddDel_WithButtons::~DbAddDel_WithButtons
    at glom/mode_data/db_adddel/db_adddel_withbuttons.cc line 55
  • #38 Glom::Box_Data_List::~Box_Data_List
    at glom/mode_data/box_data_list.cc line 66
  • #39 Glom::DataWidgetChildren::Dialog_ChooseID::~Dialog_ChooseID
    at glom/mode_data/datawidget/dialog_choose_id.cc line 72
  • #40 Glom::DataWidgetChildren::Dialog_ChooseID::~Dialog_ChooseID
    at glom/mode_data/datawidget/dialog_choose_id.cc line 80
  • #41 Glom::DataWidget::offer_related_record_id_find
    at glom/mode_data/datawidget/datawidget.cc line 706
  • #42 Glom::DataWidget::on_button_select_id
    at glom/mode_data/datawidget/datawidget.cc line 609
  • #43 sigc::bound_mem_functor0<void, Glom::DataWidget>::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/mem_fun.h line 1787
  • #44 sigc::adaptor_functor<sigc::bound_mem_functor0<void, Glom::DataWidget> >::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/adaptors/adaptor_trait.h line 251
  • #45 sigc::internal::slot_call0<sigc::bound_mem_functor0<void, Glom::DataWidget>, void>::call_it
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/slot.h line 103
  • #46 sigc::slot0<void>::operator()
    at /opt/gnome30/include/sigc++-2.0/sigc++/functors/slot.h line 440
  • #47 Glib::SignalProxyNormal::slot0_void_callback
    at signalproxy.cc line 95
  • #48 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #49 g_closure_invoke
    at gclosure.c line 774
  • #50 signal_emit_unlocked_R
    at gsignal.c line 3372
  • #51 g_signal_emit_valist
    at gsignal.c line 3033
  • #52 g_signal_emit
    at gsignal.c line 3090
  • #53 gtk_button_clicked
    at gtkbutton.c line 1332
  • #54 gtk_real_button_released
    at gtkbutton.c line 1948
  • #55 Gtk::Button_Class::released_callback
    at button.cc line 243
  • #56 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #57 g_type_class_meta_marshal
    at gclosure.c line 885
  • #58 g_closure_invoke
    at gclosure.c line 774
  • #59 signal_emit_unlocked_R
    at gsignal.c line 3232
  • #60 g_signal_emit_valist
    at gsignal.c line 3033
  • #61 g_signal_emit
    at gsignal.c line 3090
  • #62 gtk_button_button_release
    at gtkbutton.c line 1840
  • #63 Gtk::Widget_Class::button_release_event_callback
    at widget.cc line 4455
  • #64 _gtk_marshal_BOOLEAN__BOXED
    at gtkmarshalers.c line 85
  • #65 g_type_class_meta_marshal
    at gclosure.c line 885
  • #66 g_closure_invoke
    at gclosure.c line 774
  • #67 signal_emit_unlocked_R
    at gsignal.c line 3340
  • #68 g_signal_emit_valist
    at gsignal.c line 3043
  • #69 g_signal_emit
    at gsignal.c line 3090
  • #70 gtk_widget_event_internal
    at gtkwidget.c line 6154
  • #71 gtk_widget_event
    at gtkwidget.c line 5870
  • #72 gtk_propagate_event
    at gtkmain.c line 2420
  • #73 gtk_main_do_event
    at gtkmain.c line 1687
  • #74 _gdk_event_emit
    at gdkevents.c line 71
  • #75 gdk_event_source_dispatch
    at gdkeventsource.c line 360
  • #76 g_main_dispatch
    at gmain.c line 2510
  • #77 g_main_context_dispatch
    at gmain.c line 3047
  • #78 g_main_context_iterate
    at gmain.c line 3118
  • #79 g_main_loop_run
    at gmain.c line 3312
  • #80 gtk_main
    at gtkmain.c line 1163
  • #81 Gtk::Main::run_impl
    at main.cc line 436
  • #82 Gtk::Main::run
    at main.cc line 400
  • #83 main
    at glom/main.cc line 629


After that warning, but not before, valgrind says:

glibmm-WARNING **: Failed to wrap object of type 'gtkmm__GtkTreeView'. Hint: this error is commonly caused by failing to call a library init() function.
==17231== Invalid read of size 4
==17231==    at 0x816B17C: Gtk::Widget::gobj() (widget.h:289)
==17231==    by 0x4E1214B: Gtk::CellRenderer::get_preferred_width_vfunc(Gtk::Widget&, int&, int&) const (cellrenderer.cc:1040)
==17231==    by 0x4E0FA02: Gtk::CellRenderer_Class::get_preferred_width_vfunc_callback(_GtkCellRenderer*, _GtkWidget*, int*, int*) (cellrenderer.cc:68)
==17231==    by 0x5425808: gtk_cell_renderer_get_preferred_width (gtkcellrenderer.c:1465)
==17231==    by 0x5419B1E: gtk_cell_area_request_renderer (gtkcellarea.c:3600)
==17231==    by 0x541C52A: compute_size (gtkcellareabox.c:1533)
==17231==    by 0x541CE21: gtk_cell_area_box_get_preferred_width (gtkcellareabox.c:1822)
==17231==    by 0x54158BD: gtk_cell_area_get_preferred_width (gtkcellarea.c:2096)
==17231==    by 0x568B00D: gtk_tree_view_column_cell_get_size (gtktreeviewcolumn.c:2908)
==17231==    by 0x566EB8C: validate_row (gtktreeview.c:6082)
==17231==    by 0x566F4D5: validate_visible_area (gtktreeview.c:6295)
==17231==    by 0x5670618: do_presize_handler (gtktreeview.c:6758)
==17231==    by 0x5670873: gtk_tree_view_bin_process_updates (gtktreeview.c:6813)
==17231==    by 0x5679AFE: gtk_tree_view_adjustment_changed (gtktreeview.c:11268)
==17231==    by 0x567A77A: gtk_tree_view_do_set_hadjustment (gtktreeview.c:11569)
==17231==    by 0x566425B: gtk_tree_view_set_property (gtktreeview.c:1793)
==17231==    by 0x5C5F383: object_set_property (gobject.c:1342)
==17231==    by 0x5C6090B: g_object_set_valist (gobject.c:1937)
==17231==    by 0x5C60DB6: g_object_set (gobject.c:2043)
==17231==    by 0x559C413: gtk_scrolled_window_remove (gtkscrolledwindow.c:2003)
==17231==    by 0x4E2AD50: Gtk::Container_Class::remove_callback(_GtkContainer*, _GtkWidget*) (container.cc:171)
==17231==    by 0x5C5C9B5: g_cclosure_marshal_VOID__OBJECT (gmarshal.c:644)
==17231==    by 0x5C5A4CF: g_type_class_meta_marshal (gclosure.c:885)
==17231==    by 0x5C5A1C8: g_closure_invoke (gclosure.c:774)
==17231==    by 0x5C7225C: signal_emit_unlocked_R (gsignal.c:3232)
==17231==    by 0x5C71AE3: g_signal_emit_valist (gsignal.c:3033)
==17231==    by 0x5C71DC2: g_signal_emit (gsignal.c:3090)
==17231==    by 0x5452169: gtk_container_remove (gtkcontainer.c:1539)
==17231==    by 0x56A922B: gtk_widget_dispose (gtkwidget.c:10101)
==17231==    by 0x4EF08F7: Gtk::Widget_Class::dispose_vfunc_callback(_GObject*) (widget.cc:601)
==17231==    by 0x5C5EAE7: g_object_run_dispose (gobject.c:1051)
==17231==    by 0x4F1FF62: Gtk::Object::_release_c_instance() (object.cc:148)
==17231==    by 0x4F203E3: Gtk::Object::destroy_() (object.cc:260)
==17231==    by 0x4EE32DF: Gtk::TreeView::~TreeView() (treeview.cc:1140)
==17231==    by 0x818A443: Glom::DbAddDel::~DbAddDel() (db_adddel.cc:126)
==17231==    by 0x8199138: Glom::DbAddDel_WithButtons::~DbAddDel_WithButtons() (db_adddel_withbuttons.cc:55)
==17231==    by 0x817A3C0: Glom::Box_Data_List::~Box_Data_List() (box_data_list.cc:66)
==17231==    by 0x81C3938: Glom::DataWidgetChildren::Dialog_ChooseID::~Dialog_ChooseID() (dialog_choose_id.cc:72)
==17231==    by 0x81C3B36: Glom::DataWidgetChildren::Dialog_ChooseID::~Dialog_ChooseID() (dialog_choose_id.cc:80)
==17231==    by 0x81B5D03: Glom::DataWidget::offer_related_record_id_find(Gnome::Gda::Value&) (datawidget.cc:706)
==17231==    by 0x81B574D: Glom::DataWidget::on_button_select_id() (datawidget.cc:609)
==17231==    by 0x81B862F: sigc::bound_mem_functor0<void, Glom::DataWidget>::operator()() const (in /opt/gnome30/bin/glom)
==17231==    by 0x81B8489: sigc::adaptor_functor<sigc::bound_mem_functor0<void, Glom::DataWidget> >::operator()() const (adaptor_trait.h:251)
==17231==    by 0x81B821D: sigc::internal::slot_call0<sigc::bound_mem_functor0<void, Glom::DataWidget>, void>::call_it(sigc::internal::slot_rep*) (slot.h:103)
==17231==    by 0x4146425: sigc::slot0<void>::operator()() const (slot.h:440)
==17231==    by 0x52D4DAA: Glib::SignalProxyNormal::slot0_void_callback(_GObject*, void*) (signalproxy.cc:95)
==17231==    by 0x5C5BE8F: g_cclosure_marshal_VOID__VOID (gmarshal.c:85)
==17231==    by 0x5C5A1C8: g_closure_invoke (gclosure.c:774)
==17231==    by 0x5C7276A: signal_emit_unlocked_R (gsignal.c:3372)
==17231==    by 0x5C71AE3: g_signal_emit_valist (gsignal.c:3033)
==17231==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
Comment 18 Murray Cumming 2012-02-10 16:43:43 UTC
Ah, I was wasting my time by testing that. The GTK+ patch has not been pushed.
Comment 19 Kjell Ahlstedt 2013-10-13 14:39:58 UTC
Does this problem still exist after bug 605728 was fixed? (gtkmm 3.7.12 and
3.8.1)

The fixes of bug 605728 might affect the cases that result in the message
"Attempted to create a 2nd C++ wrapper for a C instance whose C++ wrapper has
been deleted." The message in comment 3 in different. It's probably not related
to bug 605728.
Comment 20 Murray Cumming 2013-10-27 19:37:20 UTC
Yes, this seems to be fixed, presumably by your fix in gtkmm. Thanks.

Now I have removed the workaround from glom's git master.