I am trying to throw exceptions in gtk signal handlers, but I am greeted with segfaults. What's the cause and are there solutions? (DMD 2.063.2 on Linux x86-64)
Here is some reduced code: import gtk.Main; import gtk.MainWindow; import gdk.Event; import gtk.Widget; class TestWindow : MainWindow { this(string a) { super(a); this.addOnButtonPress(&click); } bool click(Event, Widget) { throw new Exception(""); } } int main(string[] args) { try { Main.init(args); auto win = new TestWindow("bla"); win.showAll(); Main.run(); return 0; } catch (Exception e) { writeln (e.msg); return 1; } } In gdb I get this (line numbers not matching with above example): Program received signal SIGSEGV, Segmentation fault. 0x00000000010f0b60 in rt.deh2.terminate() () (gdb) backtrace #0 0x00000000010f0b60 in rt.deh2.terminate() () #1 0x00000000010d538d in _d_throwc () #2 0x00000000010bdbcf in main.TestWindow.click() (this=0x7ffff7f25800, _param_1=0x7ffff7f25800, _param_0=0x7ffff7f23c80) at main.d:589 #3 0x0000000000e4dca3 in gtk.Widget.Widget.callBackButtonPress() (widgetStruct=0x16b9190, event=0x17dd5d0, _widget=0x7ffff7f25800) at gtk/Widget.d:693 #4 0x0000003f41385178 in ?? () from /usr/lib64/libgtk-3.so.0 #5 0x0000003ebce114f2 in g_closure_invoke () from /usr/lib64/libgobject-2.0.so.0 #6 0x0000003ebce22501 in ?? () from /usr/lib64/libgobject-2.0.so.0 #7 0x0000003ebce2ab4e in g_signal_emit_valist () from /usr/lib64/libgobject-2.0.so.0 #8 0x0000003ebce2b002 in g_signal_emit () from /usr/lib64/libgobject-2.0.so.0 #9 0x0000003f414b299f in ?? () from /usr/lib64/libgtk-3.so.0 #10 0x0000003f4138314b in ?? () from /usr/lib64/libgtk-3.so.0 #11 0x0000003f41384e01 in gtk_main_do_event () from /usr/lib64/libgtk-3.so.0 #12 0x0000003f40a4b372 in ?? () from /usr/lib64/libgdk-3.so.0 #13 0x0000003ebca4dbd3 in g_main_context_dispatch () from /usr/lib64/libglib-2.0.so.0 #14 0x0000003ebca4ded8 in ?? () from /usr/lib64/libglib-2.0.so.0 #15 0x0000003ebca4e3ba in g_main_loop_run () from /usr/lib64/libglib-2.0.so.0 #16 0x0000003f413841bd in gtk_main () from /usr/lib64/libgtk-3.so.0 #17 0x0000000000d00747 in gtk.Main.Main.run() () at gtk/Main.d:366 #18 0x00000000010bbf3d in D main (args=...) at main.d:60 #19 0x00000000010d6038 in rt.dmain2._d_run_main() () #20 0x00000000010d5b6a in rt.dmain2._d_run_main() () #21 0x00000000010d6088 in rt.dmain2._d_run_main() () #22 0x00000000010d5b6a in rt.dmain2._d_run_main() () #23 0x00000000010d5b26 in _d_run_main () #24 0x00000000010d5973 in main () (gdb) disassemble Dump of assembler code for function _D2rt4deh29terminateFZv: 0x00000000010f0b5c <+0>: push %rbp 0x00000000010f0b5d <+1>: mov %rsp,%rbp => 0x00000000010f0b60 <+4>: hlt 0x00000000010f0b61 <+5>: pop %rbp 0x00000000010f0b62 <+6>: retq End of assembler dump. -- Marco