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