Why "segmentation fault" arises and how to avoid it?

I’m fed up with this ‘segmentation fault’. It shows up whenever I try to add a TreeView to Notebook or add a button to Notebook. I just can’t understand if it arises due to Gtk or any other part of my code. Assuming it is completely because of GUI, why does it appear and how can I avoid it? Is it possible for me to track what caused it?

It would be hard to say without a code snippet, but the usual way to track these down is using gdb or some other debugger. I usually use it via gnome-builder so I can quickly jump to files/lines.

If this is new to you, segmentation faults often happen when a caller frees memory it doesn’t own, or before it has been transferred. Maybe you’re freeing widgets (floating reference) after passing them to GtkNotebook?

No I didn’t do that. How to debug GUI applications? Will normal debuggers work?

As @andyholmes said, you can use GDB to get a stack trace of the segfault, which should tell you what you’re doing wrong—typically passing something that is not a valid object as an argument to some other function, or calling a method on a reference to an object instance that was already finalised.

Just because you’re using Python it doesn’t mean you won’t have problems; GTK is implemented in C, and it expects valid data. If the underlying data wrapped by a Python object goes away, or is invalid, you will get a segmentation fault.

Thanks a lot. I also have this doubt, what is proper way to delete a widget from memory. Shall I use widget.destroy or widget.unref?

If you want to explicitly destroy a widget, use widget.destroy(), but unless you’re trying to replace a widget from its parent, or unless you’re explicitly destroying a top level window, you should not really do that at all.

Plus, you should never use the underlying C API for memory management.

1 Like

I have a widget, that is no longer used (is an orphan data), should I destroy it using widget.destroy or Python’s garbage collector will automatically remove that widget from memory?

If you are not using a widget any more, remove all reference you have in your Python code, and the GC will collect the underlying C instance as well. Releasing a reference in Python means:

self._button = Gtk.Button()
...
del self._button # or self._button = None
2 Likes

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.