beeware / toga

A Python native, OS native GUI toolkit.
https://toga.readthedocs.io/en/latest/
BSD 3-Clause "New" or "Revised" License
4.3k stars 668 forks source link

Gtk crash `set_button_image_get_info_cb` using file dialog #2659

Open rmartin16 opened 3 months ago

rmartin16 commented 3 months ago

Describe the bug

Rare local testbed testing crash. Rooted out while evaluating https://github.com/beeware/toga/issues/2648.

Other apps, such as Handbrake, have had this crash reported to them. So, it isn't clear if this is a long standing bug in Gtk....or its use thereof.

tests/window/test_dialogs.py::test_open_file_dialog[initial_directory1-None-False-None] Open file dialog (CANCEL) dismissed
PASSED
tests/window/test_dialogs.py::test_open_file_dialog[None-None-False-result2] **
Gtk:ERROR:../../../gtk/gtkpathbar.c:1342:set_button_image_get_info_cb: assertion failed: (cancellable == data->button_data->cancellable)
Bail out! Gtk:ERROR:../../../gtk/gtkpathbar.c:1342:set_button_image_get_info_cb: assertion failed: (cancellable == data->button_data->cancellable)
Fatal Python error: Aborted

I encountered the error for different iterations of test_open_file_dialog; so, I don't think it's anything specific to one of the configurations.

Python backtrace ``` Thread 0x000073b01b4006c0 (most recent call first): File "/usr/lib/python3.12/threading.py", line 355 in wait File "/usr/lib/python3.12/concurrent/futures/_base.py", line 451 in result File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app/tests/conftest.py", line 117 in run_until_complete File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pytest_asyncio/plugin.py", line 902 in inner File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/_pytest/python.py", line 162 in pytest_pyfunc_call File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pluggy/_callers.py", line 103 in _multicall File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pluggy/_manager.py", line 120 in _hookexec File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pluggy/_hooks.py", line 513 in __call__ File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/_pytest/python.py", line 1632 in runtest File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pytest_asyncio/plugin.py", line 436 in runtest File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/_pytest/runner.py", line 173 in pytest_runtest_call File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pluggy/_callers.py", line 103 in _multicall File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pluggy/_manager.py", line 120 in _hookexec File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pluggy/_hooks.py", line 513 in __call__ File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/_pytest/runner.py", line 241 in File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/_pytest/runner.py", line 341 in from_call File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/_pytest/runner.py", line 240 in call_and_report File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/_pytest/runner.py", line 135 in runtestprotocol File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/_pytest/runner.py", line 116 in pytest_runtest_protocol File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pluggy/_callers.py", line 103 in _multicall File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pluggy/_manager.py", line 120 in _hookexec File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pluggy/_hooks.py", line 513 in __call__ File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/_pytest/main.py", line 364 in pytest_runtestloop File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pluggy/_callers.py", line 103 in _multicall File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pluggy/_manager.py", line 120 in _hookexec File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pluggy/_hooks.py", line 513 in __call__ File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/_pytest/main.py", line 339 in _main File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/_pytest/main.py", line 285 in wrap_session File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/_pytest/main.py", line 332 in pytest_cmdline_main File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pluggy/_callers.py", line 103 in _multicall File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pluggy/_manager.py", line 120 in _hookexec File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/pluggy/_hooks.py", line 513 in __call__ File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/_pytest/config/__init__.py", line 178 in main File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app/tests/testbed.py", line 31 in run_tests File "/usr/lib/python3.12/threading.py", line 1010 in run File "/usr/lib/python3.12/threading.py", line 1073 in _bootstrap_inner File "/usr/lib/python3.12/threading.py", line 1030 in _bootstrap Current thread 0x000073b0274f8740 (most recent call first): File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/gi/overrides/Gio.py", line 42 in run File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/gbulb/glib_events.py", line 839 in run File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/gbulb/gtk.py", line 39 in run File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/gbulb/glib_events.py", line 886 in run_forever File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/toga_gtk/app.py", line 198 in main_loop File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/toga/app.py", line 632 in main_loop File "/home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app/tests/testbed.py", line 165 in File "", line 88 in _run_code File "", line 198 in _run_module_as_main Extension modules: gi._gi, cairo._cairo, gi._gi_cairo (total: 3) Aborted (core dumped) ```
gdb backtrace ```c++ (gdb) bt #0 __pthread_kill_implementation (no_tid=0, signo=6, threadid=) at ./nptl/pthread_kill.c:44 #1 __pthread_kill_internal (signo=6, threadid=) at ./nptl/pthread_kill.c:78 #2 __GI___pthread_kill (threadid=, signo=signo@entry=6) at ./nptl/pthread_kill.c:89 #3 0x000077929864526e in __GI_raise (sig=6) at ../sysdeps/posix/raise.c:26 #4 0x0000779298645320 in () at /lib/x86_64-linux-gnu/libc.so.6 #5 __pthread_kill_implementation (no_tid=0, signo=6, threadid=) at ./nptl/pthread_kill.c:44 #6 __pthread_kill_internal (signo=6, threadid=) at ./nptl/pthread_kill.c:78 #7 __GI___pthread_kill (threadid=, signo=signo@entry=6) at ./nptl/pthread_kill.c:89 #8 0x000077929864526e in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26 #9 0x00007792986288ff in __GI_abort () at ./stdlib/abort.c:79 #10 0x0000779296afcf5b in g_assertion_message (domain=domain@entry=0x779295431014 "Gtk", file=file@entry=0x77929543f229 "../../../gtk/gtkpathbar.c", line=line@entry=1342, func=func@entry=0x779295499740 <__func__.6.lto_priv.100> "set_button_image_get_info_cb", message=message@entry=0x5e4f6b320e60 "assertion failed: (cancellable == data->button_data->cancellable)") at ../../../glib/gtestutils.c:3331 #11 0x0000779296b65a97 in g_assertion_message_expr (domain=domain@entry=0x779295431014 "Gtk", file=file@entry=0x77929543f229 "../../../gtk/gtkpathbar.c", line=line@entry=1342, func=func@entry=0x779295499740 <__func__.6.lto_priv.100> "set_button_image_get_info_cb", expr=expr@entry=0x7792954672a8 "cancellable == data->button_data->cancellable") at ../../../glib/gtestutils.c:3357 #12 0x000077929524286b in set_button_image_get_info_cb (cancellable=0x5e4f6b32b000 [GCancellable], info=0x779198002760 [GFileInfo], error=0x0, user_data=0x5e4f6739a340) at ../../../gtk/gtkpathbar.c:1342 #13 0x0000779295199623 in query_info_callback (source_object=, result=, user_data=0x5e4f6b302a10) at ../../../gtk/gtkfilesystem.c:417 #14 0x00007792961e17ab in g_task_return_now (task=0x5e4f6b2dc2c0 [GTask]) at ../../../gio/gtask.c:1361 #15 0x00007792961e17e5 in complete_in_idle_cb (task=0x5e4f6b2dc2c0) at ../../../gio/gtask.c:1375 #16 0x0000779296b3a48e in g_main_dispatch (context=0x5e4f66229c30) at ../../../glib/gmain.c:3344 #17 0x0000779296b99717 in g_main_context_dispatch_unlocked (context=0x5e4f66229c30) at ../../../glib/gmain.c:4152 #18 g_main_context_iterate_unlocked.isra.0 (context=context@entry=0x5e4f66229c30, block=block@entry=1, dispatch=dispatch@entry=1, self=) at ../../../glib/gmain.c:4217 #19 0x0000779296b39a53 in g_main_context_iteration (context=context@entry=0x5e4f66229c30, may_block=may_block@entry=1) at ../../../glib/gmain.c:4282 #20 0x000077929621788d in g_application_run (application=0x5e4f663b1f40 [GtkApplication], argc=, argv=0x0) at ../../../gio/gapplication.c:2712 #21 0x0000779298158b16 in ffi_call_unix64 () at ../src/x86/unix64.S:104 #22 0x00007792981553ef in ffi_call_int (cif=cif@entry=0x5e4f663c8858, fn=, rvalue=, avalue=, closure=closure@entry=0x0) at ../src/x86/ffi64.c:673 #23 0x00007792981580be in ffi_call (cif=0x5e4f663c8858, fn=, rvalue=, avalue=) at ../src/x86/ffi64.c:710 #24 0x0000779296c6b711 in pygi_invoke_c_callable () at /home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/gi/_gi.cpython-312-x86_64-linux-gnu.so #25 0x0000779296c6d90c in pygi_function_cache_invoke () at /home/user/github/beeware/toga/testbed/build/testbed/ubuntu/noble/testbed-0.0.1/usr/lib/testbed/app_packages/gi/_gi.cpython-312-x86_64-linux-gnu.so #26 0x0000779298b8482c in _PyObject_Call (kwargs=0x7792958c8900, args=0x7792964bc640, callable=0x7792964087b0, tstate=0x77929929ff68 <_PyRuntime+459656>) at ../Objects/call.c:367 #27 _PyObject_Call (tstate=0x77929929ff68 <_PyRuntime+459656>, callable=0x7792964087b0, args=0x7792964bc640, kwargs=0x7792958c8900) at ../Objects/call.c:339 #28 0x0000779298b19dec in _PyEval_EvalFrameDefault (tstate=tstate@entry=0x77929929ff68 <_PyRuntime+459656>, frame=, frame@entry=0x7792994ad1b8, throwflag=throwflag@entry=0) at Python/bytecodes.c:3254 #29 0x0000779298c9d1ff in _PyEval_EvalFrame (throwflag=0, frame=0x7792994ad1b8, tstate=0x77929929ff68 <_PyRuntime+459656>) at ../Include/internal/pycore_ceval.h:89 #30 _PyEval_Vector (args=0x0, argcount=0, kwnames=0x0, locals=0x7792989f92c0, func=0x7792989da2a0, tstate=0x77929929ff68 <_PyRuntime+459656>) at ../Python/ceval.c:1683 #31 PyEval_EvalCode (co=co@entry=0x5e4f65b24650, globals=globals@entry=0x7792989f92c0, locals=locals@entry=0x7792989f92c0) at ../Python/ceval.c:578 #32 0x0000779298c99180 in builtin_exec_impl (module=, closure=, locals=0x7792989f92c0, globals=0x7792989f92c0, source=0x5e4f65b24650) at ../Python/bltinmodule.c:1096 #33 builtin_exec (module=, args=, nargs=, kwnames=) at ../Python/clinic/bltinmodule.c.h:586 #34 0x0000779298bdc4ac in cfunction_vectorcall_FASTCALL_KEYWORDS (func=0x779298995e40, args=0x7792994ad180, nargsf=, kwnames=0x0) at ../Objects/methodobject.c:438 #35 0x0000779298b82afc in _PyObject_VectorcallTstate (kwnames=0x0, nargsf=9223372036854775810, args=0x7792994ad180, callable=0x779298995e40, tstate=0x77929929ff68 <_PyRuntime+459656>) at ../Include/internal/pycore_call.h:92 #36 PyObject_Vectorcall (callable=callable@entry=0x779298995e40, args=args@entry=0x7792994ad180, nargsf=9223372036854775810, kwnames=0x0) at ../Objects/call.c:325 #37 0x0000779298b1d5ee in _PyEval_EvalFrameDefault (tstate=, frame=, throwflag=) at Python/bytecodes.c:2706 #38 0x00005e4f63b3ca74 in ??? () #39 0x000077929862a1ca in __libc_start_call_main (main=main@entry=0x5e4f63b3c500, argc=argc@entry=2, argv=argv@entry=0x7ffd7e594728) at ../sysdeps/nptl/libc_start_call_main.h:58 #40 0x000077929862a28b in __libc_start_main_impl (main=0x5e4f63b3c500, argc=2, argv=0x7ffd7e594728, init=, fini=, rtld_fini=, stack_end=0x7ffd7e594718) at ../csu/libc-start.c:360 #41 0x00005e4f63b3cbe5 in ??? () ```

Steps to reproduce

Repeatedly run briefcase run --test for the testbed.

Expected behavior

No crash.

Screenshots

No response

Environment

Logs

No response

Additional context

No response