GktD: exceptions in handlers cause segfaults.
Marco Leise
Marco.Leise at gmx.de
Fri Jul 19 02:10:04 PDT 2013
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
More information about the Digitalmars-d-learn
mailing list