Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exit dispatcher causes segfault #4849

Open
bubba-champion opened this issue Feb 26, 2024 · 8 comments
Open

Exit dispatcher causes segfault #4849

bubba-champion opened this issue Feb 26, 2024 · 8 comments
Labels
bug Something isn't working

Comments

@bubba-champion
Copy link

Hyprland Version

System/Version info
Hyprland, built from branch makepkg at commit 1742605eb89b17d04d807dfb1a21ac0deb3a945c  (keybinds: fix movewindoworgroup onto empy workspace on next monitor (4486)).
Date: Mon Feb 26 17:05:24 2024
Tag: v0.35.0-102-g1742605e

flags: (if any)


System Information:
System name: Linux
Node name: localhost
Release: 6.7.6-arch1-1
Version: #1 SMP PREEMPT_DYNAMIC Fri, 23 Feb 2024 16:31:48 +0000


GPU information:
03:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Navi 24 [Radeon RX 6400/6500 XT/6500M] [1002:743f] (rev c7) (prog-if 00 [VGA controller])
08:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Cezanne [Radeon Vega Series / Radeon Vega Mobile Series] [1002:1638] (rev c8) (prog-if 00 [VGA controller])


os-release: NAME="Arch Linux"
PRETTY_NAME="Arch Linux"
ID=arch
BUILD_ID=rolling
ANSI_COLOR="38;2;23;147;209"
HOME_URL="https://archlinux.org/"
DOCUMENTATION_URL="https://wiki.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://gitlab.archlinux.org/groups/archlinux/-/issues"
PRIVACY_POLICY_URL="https://terms.archlinux.org/docs/privacy-policy/"
LOGO=archlinux-logo


plugins:

Bug or Regression?

Bug

Description

Some time ago I was facing a program freeze when using exit dispatcher, but after some commits the freezes on exit are gone and now I have this segfault 100% of the time when exiting

How to reproduce

  1. Leave Hyprland by using hyprctl dispatch exit or by keybind
  2. Encounter a segmentation fault

Crash reports, logs, images, videos

bt.txt

@bubba-champion bubba-champion added the bug Something isn't working label Feb 26, 2024
@vaxerski
Copy link
Member

patch69.txt
try

@bubba-champion
Copy link
Author

After applying this patch, the problem has become less reproducible, but it is still there. New backtrace is here. bt-1.txt

@bubba-champion
Copy link
Author

Based on my testing, with this patch crashes occurs when using Hyprland for a certain amount of time, in addition to SIGSEGV, I'm also encountering an SIGABRT. Backtrace from SIGABRT core dump: bt-2.txt. Should I attach a backtrace with debug symbols?

@vaxerski
Copy link
Member

there are enough symbols, feel free to debug this yourself tho, I have better things to do atm

@gulafaran
Copy link
Contributor

im not that well wersed in wayland/wlroots/hyprland but with my trace in #5471 and your unpatched one i think wl_display_destroy_clients(g_pCompositor->m_sWLDisplay) is generating an event on an listener that was already destroyed with removeAllSignals(), and something like this mitigates it?

diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index 3ac9a73f..51e96d36 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -418,12 +418,11 @@ void CCompositor::cleanup() {
         g_pXWaylandManager->m_sWLRXWayland = nullptr;
     }
 
+    wl_display_destroy_clients(g_pCompositor->m_sWLDisplay);
+
     removeAllSignals();
 
     g_pInputManager.reset();
-
-    wl_display_destroy_clients(g_pCompositor->m_sWLDisplay);
-
     g_pDecorationPositioner.reset();
     g_pCursorManager.reset();
     g_pPluginSystem.reset();

@gulafaran
Copy link
Contributor

im not that well wersed in wayland/wlroots/hyprland but with my trace in #5471 and your unpatched one i think wl_display_destroy_clients(g_pCompositor->m_sWLDisplay) is generating an event on an listener that was already destroyed with removeAllSignals(), and something like this mitigates it?

diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index 3ac9a73f..51e96d36 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -418,12 +418,11 @@ void CCompositor::cleanup() {
         g_pXWaylandManager->m_sWLRXWayland = nullptr;
     }
 
+    wl_display_destroy_clients(g_pCompositor->m_sWLDisplay);
+
     removeAllSignals();
 
     g_pInputManager.reset();
-
-    wl_display_destroy_clients(g_pCompositor->m_sWLDisplay);
-
     g_pDecorationPositioner.reset();
     g_pCursorManager.reset();
     g_pPluginSystem.reset();

or well it seems it just eventually later coredumped in another place, is this some kind of thread race to finish thing hm

@bubba-champion
Copy link
Author

Can't reproduce anymore with the following commits: compositor: move wl_display_destroy_clients, workspace: fix crash on destruction of compositor

@bubba-champion
Copy link
Author

Reproducible again on the latest HEAD. Also, when using the exit dispatcher, Hyprland periodically hangs and exits only after receiving any input, but in this state, Hyprland does not stop responding to requests from hyprctl via ssh. The symptoms mentioned earlier are very similar to #4599.

bt.txt
#0  0x00005d129a3581ea in CSharedPointer<CPointerManager::SMonitorPointerState>::~CSharedPointer() ()
#1  0x00005d129a3524e5 in void std::destroy_at<CSharedPointer<CPointerManager::SMonitorPointerState> >(CSharedPointer<CPointerManager::SMonitorPointerState>*) ()
#2  0x00005d129a34ef02 in void std::_Destroy<CSharedPointer<CPointerManager::SMonitorPointerState> >(CSharedPointer<CPointerManager::SMonitorPointerState>*) ()
#3  0x00005d129a34b0b9 in void std::_Destroy_aux<false>::__destroy<CSharedPointer<CPointerManager::SMonitorPointerState>*>(CSharedPointer<CPointerManager::SMonitorPointerState>*, CSharedPointer<CPointerManager::SMonitorPointerState>*) ()
#4  0x00005d129a347012 in void std::_Destroy<CSharedPointer<CPointerManager::SMonitorPointerState>*>(CSharedPointer<CPointerManager::SMonitorPointerState>*, CSharedPointer<CPointerManager::SMonitorPointerState>*)
    ()
#5  0x00005d129a566e22 in std::vector<CSharedPointer<CPointerManager::SMonitorPointerState>, std::allocator<CSharedPointer<CPointerManager::SMonitorPointerState> > >::_M_erase_at_end(CSharedPointer<CPointerManager::SMonitorPointerState>*) ()
#6  0x00005d129a564e8b in std::vector<CSharedPointer<CPointerManager::SMonitorPointerState>, std::allocator<CSharedPointer<CPointerManager::SMonitorPointerState> > >::_M_erase(__gnu_cxx::__normal_iterator<CSharedPointer<CPointerManager::SMonitorPointerState>*, std::vector<CSharedPointer<CPointerManager::SMonitorPointerState>, std::allocator<CSharedPointer<CPointerManager::SMonitorPointerState> > > >, __gnu_cxx::__normal_iterator<CSharedPointer<CPointerManager::SMonitorPointerState>*, std::vector<CSharedPointer<CPointerManager::SMonitorPointerState>, std::allocator<CSharedPointer<CPointerManager::SMonitorPointerState> > > >) ()
#7  0x00005d129a5620b2 in std::vector<CSharedPointer<CPointerManager::SMonitorPointerState>, std::allocator<CSharedPointer<CPointerManager::SMonitorPointerState> > >::erase(__gnu_cxx::__normal_iterator<CSharedPointer<CPointerManager::SMonitorPointerState> const*, std::vector<CSharedPointer<CPointerManager::SMonitorPointerState>, std::allocator<CSharedPointer<CPointerManager::SMonitorPointerState> > > >, __gnu_cxx::__normal_iterator<CSharedPointer<CPointerManager::SMonitorPointerState> const*, std::vector<CSharedPointer<CPointerManager::SMonitorPointerState>, std::allocator<CSharedPointer<CPointerManager::SMonitorPointerState> > > >) ()
#8  0x00005d129a5537db in std::vector<CSharedPointer<CPointerManager::SMonitorPointerState>, std::allocator<CSharedPointer<CPointerManager::SMonitorPointerState> > >::size_type std::erase_if<CSharedPointer<CPointerManager::SMonitorPointerState>, std::allocator<CSharedPointer<CPointerManager::SMonitorPointerState> >, CPointerManager::allocator()::{lambda(void*, SCallbackInfo&, std::any)#1}::operator()(void*, SCallbackInfo&, std::any) const::{lambda(void*, std::any)#3}::operator()(void*, std::any) const::{lambda(auto:1 const&)#1}>(std::vector<CSharedPointer<CPointerManager::SMonitorPointerState>, std::allocator<CSharedPointer<CPointerManager::SMonitorPointerState> > >&, CPointerManager::allocator()::{lambda(void*, SCallbackInfo&, std::any)#1}::operator()(void*, SCallbackInfo&, std::any) const::{lambda(void*, std::any)#3}::operator()(void*, std::any) const::{lambda(auto:1 const&)#1}) ()
#9  0x00005d129a54b01b in CPointerManager::CPointerManager()::{lambda(void*, SCallbackInfo&, std::any)#1}::operator()(void*, SCallbackInfo&, std::any) const::{lambda(void*, std::any)#3}::operator()(void*, std::any) const ()
#10 0x00005d129a55b259 in void std::__invoke_impl<void, CPointerManager::CPointerManager()::{lambda(void*, SCallbackInfo&, std::any)#1}::operator()(void*, SCallbackInfo&, std::any) const::{lambda(void*, std::any)#3}&, void*, std::any>(std::__invoke_other, CPointerManager::CPointerManager()::{lambda(void*, SCallbackInfo&, std::any)#1}::operator()(void*, SCallbackInfo&, std::any) const::{lambda(void*, std::any)#3}&, void*&&, std::any&&) ()
#11 0x00005d129a557d0b in std::enable_if<is_invocable_r_v<void, CPointerManager::CPointerManager()::{lambda(void*, SCallbackInfo&, std::any)#1}::operator()(void*, SCallbackInfo&, std::any) const::{lambda(void*, std::any)#3}&, void*, std::any>, void>::type std::__invoke_r<void, CPointerManager::CPointerManager()::{lambda(void*, SCallbackInfo&, std::any)#1}::operator()(void*, SCallbackInfo&, std::any) const::{lambda(void*, std::any)#3}&, void*, std::any>(CPointerManager::CPointerManager()::{lambda(void*, SCallbackInfo&, std::any)#1}::operator()(void*, SCallbackInfo&, std::any) const::{lambda(void*, std::any)#3}&, void*&&, std::any&&) ()
#12 0x00005d129a555329 in std::_Function_handler<void (void*, std::any), CPointerManager::CPointerManager()::{lambda(void*, SCallbackInfo&, std::any)#1}::operator()(void*, SCallbackInfo&, std::any) const::{lambda(void*, std::any)#3}>::_M_invoke(std::_Any_data const&, void*&&, std::any&&) ()
#13 0x00005d129a4ce67f in std::function<void (void*, std::any)>::operator()(void*, std::any) const ()
#14 0x00005d129a4cd819 in CStaticSignalListener::emit(std::any) ()
#15 0x00005d129a4ce814 in CSignal::emit(std::any) ()
#16 0x00005d129a4b215e in CMonitor::~CMonitor() ()
#17 0x00005d129a48a398 in std::default_delete<CMonitor>::operator()(CMonitor*) const ()
#18 0x00005d129a48a35c in CSharedPointer_::impl<CMonitor>::_destroy() ()
#19 0x00005d129a48a2f2 in CSharedPointer_::impl<CMonitor>::destroy() ()
#20 0x00005d129a3351e9 in CSharedPointer<CMonitor>::destroyImpl() ()
#21 0x00005d129a32aaac in CSharedPointer<CMonitor>::~CSharedPointer() ()
#22 0x00005d129a34ad2b in void std::destroy_at<CSharedPointer<CMonitor> >(CSharedPointer<CMonitor>*) ()
#23 0x00005d129a34661d in void std::_Destroy<CSharedPointer<CMonitor> >(CSharedPointer<CMonitor>*) ()
#24 0x00005d129a340d6a in void std::_Destroy_aux<false>::__destroy<CSharedPointer<CMonitor>*>(CSharedPointer<CMonitor>*, CSharedPointer<CMonitor>*) ()
#25 0x00005d129a33b059 in void std::_Destroy<CSharedPointer<CMonitor>*>(CSharedPointer<CMonitor>*, CSharedPointer<CMonitor>*) ()
#26 0x00005d129a332ff6 in std::vector<CSharedPointer<CMonitor>, std::allocator<CSharedPointer<CMonitor> > >::_M_erase_at_end(CSharedPointer<CMonitor>*) ()
#27 0x00005d129a489bd7 in std::vector<CSharedPointer<CMonitor>, std::allocator<CSharedPointer<CMonitor> > >::_M_erase(__gnu_cxx::__normal_iterator<CSharedPointer<CMonitor>*, std::vector<CSharedPointer<CMonitor>, s--Type <RET> for more, q to quit, c to continue without paging--c
td::allocator<CSharedPointer<CMonitor> > > >, __gnu_cxx::__normal_iterator<CSharedPointer<CMonitor>*, std::vector<CSharedPointer<CMonitor>, std::allocator<CSharedPointer<CMonitor> > > >) ()
#28 0x00005d129a48966a in std::vector<CSharedPointer<CMonitor>, std::allocator<CSharedPointer<CMonitor> > >::erase(__gnu_cxx::__normal_iterator<CSharedPointer<CMonitor> const*, std::vector<CSharedPointer<CMonitor>, std::allocator<CSharedPointer<CMonitor> > > >, __gnu_cxx::__normal_iterator<CSharedPointer<CMonitor> const*, std::vector<CSharedPointer<CMonitor>, std::allocator<CSharedPointer<CMonitor> > > >) ()
#29 0x00005d129a4878f6 in std::vector<CSharedPointer<CMonitor>, std::allocator<CSharedPointer<CMonitor> > >::size_type std::erase_if<CSharedPointer<CMonitor>, std::allocator<CSharedPointer<CMonitor> >, Events::listener_monitorDestroy(void*, void*)::{lambda(CSharedPointer<CMonitor>&)#1}>(std::vector<CSharedPointer<CMonitor>, std::allocator<CSharedPointer<CMonitor> > >&, Events::listener_monitorDestroy(void*, void*)::{lambda(CSharedPointer<CMonitor>&)#1}) ()
#30 0x00005d129a48739e in Events::listener_monitorDestroy(void*, void*) ()
#31 0x00005d129a4281ff in void std::__invoke_impl<void, void (*&)(void*, void*), void*, void*>(std::__invoke_other, void (*&)(void*, void*), void*&&, void*&&) ()
#32 0x00005d129a427b1b in std::enable_if<is_invocable_r_v<void, void (*&)(void*, void*), void*, void*>, void>::type std::__invoke_r<void, void (*&)(void*, void*), void*, void*>(void (*&)(void*, void*), void*&&, void*&&) ()
#33 0x00005d129a4271e6 in std::_Function_handler<void (void*, void*), void (*)(void*, void*)>::_M_invoke(std::_Any_data const&, void*&&, void*&&) ()
#34 0x00005d129a4cad7f in std::function<void (void*, void*)>::operator()(void*, void*) const ()
#35 0x00005d129a4c9891 in CHyprWLListener::emit(void*) ()
#36 0x00005d129a4c9299 in handleWrapped(wl_listener*, void*) ()
#37 0x00007d2b3c28401e in wl_signal_emit_mutable () at /usr/lib/libwayland-server.so.0
#38 0x00005d129a8a0da0 in wlr_output_destroy ()
#39 0x00005d129a8859c1 in disconnect_drm_connector ()
#40 0x00005d129a885a13 in destroy_drm_connector ()
#41 0x00005d129a87eb47 in backend_destroy ()
#42 0x00005d129a87c077 in wlr_backend_destroy ()
#43 0x00005d129a894682 in multi_backend_destroy ()
#44 0x00005d129a87c077 in wlr_backend_destroy ()
#45 0x00005d129a3022c6 in CCompositor::cleanup() ()
#46 0x00005d129a486a89 in Events::listener_monitorFrame(void*, void*) ()
#47 0x00005d129a4281ff in void std::__invoke_impl<void, void (*&)(void*, void*), void*, void*>(std::__invoke_other, void (*&)(void*, void*), void*&&, void*&&) ()
#48 0x00005d129a427b1b in std::enable_if<is_invocable_r_v<void, void (*&)(void*, void*), void*, void*>, void>::type std::__invoke_r<void, void (*&)(void*, void*), void*, void*>(void (*&)(void*, void*), void*&&, void*&&) ()
#49 0x00005d129a4271e6 in std::_Function_handler<void (void*, void*), void (*)(void*, void*)>::_M_invoke(std::_Any_data const&, void*&&, void*&&) ()
#50 0x00005d129a4cad7f in std::function<void (void*, void*)>::operator()(void*, void*) const ()
#51 0x00005d129a4c9891 in CHyprWLListener::emit(void*) ()
#52 0x00005d129a4c9299 in handleWrapped(wl_listener*, void*) ()
#53 0x00007d2b3c28401e in wl_signal_emit_mutable () at /usr/lib/libwayland-server.so.0
#54 0x00005d129a8a1e54 in wlr_output_send_frame ()
#55 0x00005d129a8a1e98 in schedule_frame_handle_idle_timer ()
#56 0x00007d2b3c285a23 in wl_event_loop_dispatch_idle () at /usr/lib/libwayland-server.so.0
#57 0x00007d2b3c285b3d in wl_event_loop_dispatch () at /usr/lib/libwayland-server.so.0
#58 0x00007d2b3c2862d7 in wl_display_run () at /usr/lib/libwayland-server.so.0
#59 0x00005d129a5a5c2d in CEventLoopManager::enterLoop(wl_display*, wl_event_loop*) ()
#60 0x00005d129a304056 in CCompositor::startCompositor() ()
#61 0x00005d129a502c7b in main ()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants