rabbit-shocker/rabbit

SEGV with gtk-quartz on MacOS

Closed this issue · 11 comments

nobu commented

終了時にSEGVすることがあります。

cairo @1.14.10_0+quartz+universal (active)
gtk2 @2.24.31_0+quartz+universal (active)
pango @1.40.12_0+quartz+universal (active)

master, 2.2.0, 2.1.9 で発生しました。

finalizerの呼び出し順序に依存しているのかも。

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libsystem_kernel.dylib        	0x00007fff926a2f06 __pthread_kill + 10
1   libsystem_pthread.dylib       	0x00007fff93f754ec pthread_kill + 90
2   libsystem_c.dylib             	0x00007fff995e26df abort + 129
3   libruby.2.5.0.dylib           	0x000000010ff4e129 die + 9
4   libruby.2.5.0.dylib           	0x000000010ff4e388 rb_bug_context + 600
5   libruby.2.5.0.dylib           	0x0000000110036421 sigsegv + 81
6   libsystem_platform.dylib      	0x00007fff8c98352a _sigtramp + 26
7   ???                           	000000000000000000 0 + 0
8   libgobject-2.0.0.dylib        	0x00000001112ebca8 g_signal_emit_valist + 2028
9   libgobject-2.0.0.dylib        	0x00000001112ec35a g_signal_emit + 134
10  libgtk-3.0.dylib              	0x00000001132c2973 gtk_widget_dispose + 122
11  libgtk-3.0.dylib              	0x00000001132d1080 gtk_window_dispose + 76
12  libgobject-2.0.0.dylib        	0x00000001112dc770 g_object_unref + 208
13  libgtk-3.0.dylib              	0x0000000113198123 gtk_menu_destroy + 252
14  libgobject-2.0.0.dylib        	0x00000001112d7a5c g_closure_invoke + 345
15  libgobject-2.0.0.dylib        	0x00000001112eb3ed signal_emit_unlocked_R + 2931
16  libgobject-2.0.0.dylib        	0x00000001112ebca8 g_signal_emit_valist + 2028
17  libgobject-2.0.0.dylib        	0x00000001112ec35a g_signal_emit + 134
18  libgtk-3.0.dylib              	0x00000001132c2973 gtk_widget_dispose + 122
19  libgobject-2.0.0.dylib        	0x00000001112dc5d6 g_object_run_dispose + 46
20  libgtk-3.0.dylib              	0x00000001131a041e gtk_menu_item_destroy + 26
21  libgobject-2.0.0.dylib        	0x00000001112d7a5c g_closure_invoke + 345
22  libgobject-2.0.0.dylib        	0x00000001112eb3ed signal_emit_unlocked_R + 2931
23  libgobject-2.0.0.dylib        	0x00000001112ebca8 g_signal_emit_valist + 2028
24  libgobject-2.0.0.dylib        	0x00000001112ec35a g_signal_emit + 134
25  libgtk-3.0.dylib              	0x00000001132c2973 gtk_widget_dispose + 122
26  libgobject-2.0.0.dylib        	0x00000001112dc5d6 g_object_run_dispose + 46
27  libgtk-3.0.dylib              	0x00000001131a48ce gtk_menu_shell_forall + 38
28  libgtk-3.0.dylib              	0x00000001130d1cba gtk_container_destroy + 87
29  libgobject-2.0.0.dylib        	0x00000001112d7a05 g_closure_invoke + 258
30  libgobject-2.0.0.dylib        	0x00000001112eb3ed signal_emit_unlocked_R + 2931
31  libgobject-2.0.0.dylib        	0x00000001112ebca8 g_signal_emit_valist + 2028
32  libgobject-2.0.0.dylib        	0x00000001112ec35a g_signal_emit + 134
33  libgtk-3.0.dylib              	0x00000001132c2973 gtk_widget_dispose + 122
34  libgobject-2.0.0.dylib        	0x00000001112dc770 g_object_unref + 208
35  libgtk-3.0.dylib              	0x00000001130d01f7 gtk_container_remove + 149
36  libgtk-3.0.dylib              	0x00000001132c291e gtk_widget_dispose + 37
37  libgobject-2.0.0.dylib        	0x00000001112dc770 g_object_unref + 208
38  glib2.bundle                  	0x0000000111277d29 holder_free + 89 (rbgobj_object.c:50)
39  libruby.2.5.0.dylib           	0x000000010ff66cd0 rb_gc_call_finalizer_at_exit + 2272 (gc.c:2984)
40  libruby.2.5.0.dylib           	0x000000010ff572fd ruby_cleanup + 573 (eval.c:226)
41  libruby.2.5.0.dylib           	0x000000010ff5747d ruby_run_node + 61 (eval.c:302)
42  ruby                          	0x000000010fedcf13 main + 99 (main.c:42)
43  libdyld.dylib                 	0x00007fffa05505ad start + 1
kou commented

これ、どうやって終了したときですか?qですか?それともターミナルでC-cですか?

nobu commented

どちらでも同じです。

kou commented

プロセス終了前にウィンドウを破棄しきっていないのがアレかなぁと思ったので、そこらへんを対応してみました。

nobu commented

やはり落ちますが、スタックトレースが短くなりました。

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libsystem_kernel.dylib        	0x00007fff926a2f06 __pthread_kill + 10
1   libsystem_pthread.dylib       	0x00007fff93f754ec pthread_kill + 90
2   libsystem_c.dylib             	0x00007fff995e26df abort + 129
3   libruby.2.5.0.dylib           	0x000000010396d129 die + 9
4   libruby.2.5.0.dylib           	0x000000010396d388 rb_bug_context + 600
5   libruby.2.5.0.dylib           	0x0000000103a55421 sigsegv + 81
6   libsystem_platform.dylib      	0x00007fff8c98352a _sigtramp + 26
7   ???                           	000000000000000000 0 + 0
8   libgdk-quartz-2.0.0.dylib     	0x0000000105f0e5ea gdk_quartz_drawable_release_context + 86
9   libgdk-quartz-2.0.0.dylib     	0x0000000105f0e332 gdk_quartz_cairo_surface_destroy + 29
10  libcairo.2.dylib              	0x000000010524c883 _cairo_user_data_array_fini + 64
11  libcairo.2.dylib              	0x0000000105295bbb cairo_surface_destroy + 132
12  libcairo.2.dylib              	0x000000010524c883 _cairo_user_data_array_fini + 64
13  libcairo.2.dylib              	0x000000010525ac9a _cairo_default_context_destroy + 14
14  glib2.bundle                  	0x0000000104c8ab33 boxed_free + 67 (rbgobj_boxed.c:50)
15  libruby.2.5.0.dylib           	0x0000000103985cd0 rb_gc_call_finalizer_at_exit + 2272
16  libruby.2.5.0.dylib           	0x00000001039762fd ruby_cleanup + 573
17  libruby.2.5.0.dylib           	0x000000010397647d ruby_run_node + 61
18  ruby-trunk                    	0x00000001038fcf13 main + 99 (main.c:42)
19  libdyld.dylib                 	0x00007fffa05505ad start + 1

今気づいたのですが、Thread 2で glib_worker_main が生きている状態なのですが、これは問題ないでしょうか。

Thread 2:: gmain
0   libsystem_kernel.dylib        	0x00007fff926a307a __select + 10
1   libglib-2.0.0.dylib           	0x0000000104d65771 g_poll + 399
2   libglib-2.0.0.dylib           	0x0000000104d59380 g_main_context_iterate + 326
3   libglib-2.0.0.dylib           	0x0000000104d5942f g_main_context_iteration + 55
4   libglib-2.0.0.dylib           	0x0000000104d5a4ef glib_worker_main + 53
5   libglib-2.0.0.dylib           	0x0000000104d7a536 g_thread_proxy + 90
6   libsystem_pthread.dylib       	0x00007fff93f7299d _pthread_body + 131
7   libsystem_pthread.dylib       	0x00007fff93f7291a _pthread_start + 168
8   libsystem_pthread.dylib       	0x00007fff93f70351 thread_start + 13

また、終了時に次のような警告も出ていました。

2017-09-10 22:28:23.438 ruby-trunk[79309:83879774] *** WARNING: Method userSpaceScaleFactor in class NSView is deprecated on 10.7 and later. It should not be used in new applications. Use convertRectToBacking: instead. 
Sep 10 22:28:30  ruby-trunk[79309] <Error>: CGContextRestoreGState: invalid context 0x7fc6f8506550. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
Sep 10 22:28:30  ruby-trunk[79309] <Error>: CGContextSetAllowsAntialiasing: invalid context 0x7fc6f8506550. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.

rabbit.txt
ruby-trunk_2017-09-10-222832_ruby.crash.txt

kou commented

使い終わったCairo::Contextの破棄がGC任せになっているのがアレな風に見えたので、そうならないようにしてみました。

glib_worker_mainはUNIXのシグナルを処理するスレッドで、プロセスが死ぬまで動き続けるやつなので、生きていて問題ありません。(気持ち悪くはありますが。)

kou commented

あ、その警告ですが、GTK+ 3だとでなくなっているはずです。
RABBIT_GTK_VERSION=3 rabbit ...でGTK+ 3を使うようになります。

nobu commented

変化ありませんでした。

GTK+ 3でも同じように落ちるんですが、それ以前にウィンドウのサイズと描画のサイズがあっていないようで、一部しか表示されません。
2017-09-10 22 57 14

kou commented

サイズはGDK_SCALE=1で直るかもしれません。

nobu commented

変わりませんでした…

kou commented

おぉ。。。

kou commented

3.0.0で直っているはず!