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

Reply via email to