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

Cannot access memory segfault in RealKMSOutput on shutdown #2690

Closed
Saviq opened this issue Oct 7, 2022 · 4 comments
Closed

Cannot access memory segfault in RealKMSOutput on shutdown #2690

Saviq opened this issue Oct 7, 2022 · 4 comments
Assignees

Comments

@Saviq
Copy link
Collaborator

Saviq commented Oct 7, 2022

Thread 95 (Thread 0x7f63d17fa6c0 (LWP 9883) "Mir/Workqueue"):
#0  __pthread_kill_implementation (no_tid=0, signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:44
#1  __pthread_kill_internal (signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:78
#2  __GI___pthread_kill (threadid=<optimized out>, signo=signo@entry=6) at ./nptl/pthread_kill.c:89
#3  0x00007f657069ec46 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#4  0x00007f65706857fc in __GI_abort () at ./stdlib/abort.c:79
#5  0x00007f6570ace803 in mir::fatal_error_abort(char const*, ...) (reason=0x7f65703d5128 "Unsupported attempt to continue after a fatal signal: %s") at /home/michal/dev/MirServer/mir/src/core/fatal.cpp:40
#6  0x00007f656ffd3f23 in (anonymous namespace)::fatal_signal_cleanup(int, siginfo_t*, void*) (sig=11, info=0x7f63d17f7b30, ucontext=0x7f63d17f7a00) at /home/michal/dev/MirServer/mir/src/server/run_mir.cpp:186
#7  0x00007f657069ecf0 in <signal handler called> () at /lib/x86_64-linux-gnu/libc.so.6
#8  0x00007f656dcd543c in mir::geometry::generic::Value<int, mir::geometry::WidthTag>::Value<unsigned short, true>(unsigned short const&) (this=0x7f63d17f87b8, value=<error reading variable: Cannot access memory at address 0x4>) at /home/michal/dev/MirServer/mir/include/core/mir/geometry/dimensions.h:79
#9  0x00007f656dcd4461 in mir::geometry::generic::Size<int>::Size<unsigned short const&, unsigned short const&>(unsigned short const&, unsigned short const&) (this=0x7f63d17f87b8, width=<error reading variable: Cannot access memory at address 0x4>, height=<error reading variable: Cannot access memory at address 0xe>) at /home/michal/dev/MirServer/mir/include/core/mir/geometry/size.h:52
#10 0x00007f656dcd0256 in mir::graphics::gbm::RealKMSOutput::size() const (this=0x5604ed65b9d0) at /home/michal/dev/MirServer/mir/src/platforms/gbm-kms/server/kms/real_kms_output.cpp:133
#11 0x00007f656dc8d26a in operator()(mir::graphics::gbm::KMSOutput&, mir::graphics::DisplayConfigurationOutput const&) const (__closure=0x7f63b00061c0, output=..., conf=...) at /home/michal/dev/MirServer/mir/src/platforms/gbm-kms/server/kms/cursor.cpp:392
#12 0x00007f656dc8f0d3 in std::__invoke_impl<void, mir::graphics::gbm::Cursor::place_cursor_at_locked(const std::lock_guard<std::mutex>&, mir::geometry::Point, ForceCursorState)::<lambda(mir::graphics::gbm::KMSOutput&, const mir::graphics::DisplayConfigurationOutput&)>&, mir::graphics::gbm::KMSOutput&, const mir::graphics::DisplayConfigurationOutput&>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#13 0x00007f656dc8ebd2 in std::__invoke_r<void, mir::graphics::gbm::Cursor::place_cursor_at_locked(const std::lock_guard<std::mutex>&, mir::geometry::Point, ForceCursorState)::<lambda(mir::graphics::gbm::KMSOutput&, const mir::graphics::DisplayConfigurationOutput&)>&, mir::graphics::gbm::KMSOutput&, const mir::graphics::DisplayConfigurationOutput&>(struct {...} &) (__fn=...) at /usr/include/c++/12/bits/invoke.h:111
#14 0x00007f656dc8e340 in std::_Function_handler<void(mir::graphics::gbm::KMSOutput&, const mir::graphics::DisplayConfigurationOutput&), mir::graphics::gbm::Cursor::place_cursor_at_locked(const std::lock_guard<std::mutex>&, mir::geometry::Point, ForceCursorState)::<lambda(mir::graphics::gbm::KMSOutput&, const mir::graphics::DisplayConfigurationOutput&)> >::_M_invoke(const std::_Any_data &, mir::graphics::gbm::KMSOutput &, const mir::graphics::DisplayConfigurationOutput &) (__functor=..., __args#0=..., __args#1=...) at /usr/include/c++/12/bits/std_function.h:290
#15 0x00007f656dc933af in std::function<void (mir::graphics::gbm::KMSOutput&, mir::graphics::DisplayConfigurationOutput const&)>::operator()(mir::graphics::gbm::KMSOutput&, mir::graphics::DisplayConfigurationOutput const&) const (this=0x7f63d17f8cc0, __args#0=..., __args#1=...) at /usr/include/c++/12/bits/std_function.h:591
#16 0x00007f656dc8ce08 in operator()(mir::graphics::DisplayConfigurationOutput const&) const (__closure=0x7f63d17f8aa0, conf_output=...) at /home/michal/dev/MirServer/mir/src/platforms/gbm-kms/server/kms/cursor.cpp:344
#17 0x00007f656dc8ef49 in std::__invoke_impl<void, mir::graphics::gbm::Cursor::for_each_used_output(const std::function<void(mir::graphics::gbm::KMSOutput&, const mir::graphics::DisplayConfigurationOutput&)>&)::<lambda(const mir::graphics::gbm::KMSDisplayConfiguration&)>::<lambda(const mir::graphics::DisplayConfigurationOutput&)>&, const mir::graphics::DisplayConfigurationOutput&>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#18 0x00007f656dc8e8cb in std::__invoke_r<void, mir::graphics::gbm::Cursor::for_each_used_output(const std::function<void(mir::graphics::gbm::KMSOutput&, const mir::graphics::DisplayConfigurationOutput&)>&)::<lambda(const mir::graphics::gbm::KMSDisplayConfiguration&)>::<lambda(const mir::graphics::DisplayConfigurationOutput&)>&, const mir::graphics::DisplayConfigurationOutput&>(struct {...} &) (__fn=...) at /usr/include/c++/12/bits/invoke.h:111
#19 0x00007f656dc8e10a in std::_Function_handler<void(const mir::graphics::DisplayConfigurationOutput&), mir::graphics::gbm::Cursor::for_each_used_output(const std::function<void(mir::graphics::gbm::KMSOutput&, const mir::graphics::DisplayConfigurationOutput&)>&)::<lambda(const mir::graphics::gbm::KMSDisplayConfiguration&)>::<lambda(const mir::graphics::DisplayConfigurationOutput&)> >::_M_invoke(const std::_Any_data &, const mir::graphics::DisplayConfigurationOutput &) (__functor=..., __args#0=...) at /usr/include/c++/12/bits/std_function.h:290
#20 0x00007f656dcc70f3 in std::function<void (mir::graphics::DisplayConfigurationOutput const&)>::operator()(mir::graphics::DisplayConfigurationOutput const&) const (this=0x7f63d17f8aa0, __args#0=...) at /usr/include/c++/12/bits/std_function.h:591
#21 0x00007f656dcc4c14 in mir::graphics::gbm::RealKMSDisplayConfiguration::for_each_output(std::function<void (mir::graphics::DisplayConfigurationOutput const&)>) const (this=0x5604ed6385d0, f=...) at /home/michal/dev/MirServer/mir/src/platforms/gbm-kms/server/kms/real_kms_display_configuration.cpp:70
#22 0x00007f656dc8ceb7 in operator()(mir::graphics::gbm::KMSDisplayConfiguration const&) const (__closure=0x7f63d17f8c10, kms_conf=...) at /home/michal/dev/MirServer/mir/src/platforms/gbm-kms/server/kms/cursor.cpp:339
#23 0x00007f656dc8f009 in std::__invoke_impl<void, mir::graphics::gbm::Cursor::for_each_used_output(const std::function<void(mir::graphics::gbm::KMSOutput&, const mir::graphics::DisplayConfigurationOutput&)>&)::<lambda(const mir::graphics::gbm::KMSDisplayConfiguration&)>&, const mir::graphics::gbm::KMSDisplayConfiguration&>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#24 0x00007f656dc8ea39 in std::__invoke_r<void, mir::graphics::gbm::Cursor::for_each_used_output(const std::function<void(mir::graphics::gbm::KMSOutput&, const mir::graphics::DisplayConfigurationOutput&)>&)::<lambda(const mir::graphics::gbm::KMSDisplayConfiguration&)>&, const mir::graphics::gbm::KMSDisplayConfiguration&>(struct {...} &) (__fn=...) at /usr/include/c++/12/bits/invoke.h:111
#25 0x00007f656dc8e219 in std::_Function_handler<void(const mir::graphics::gbm::KMSDisplayConfiguration&), mir::graphics::gbm::Cursor::for_each_used_output(const std::function<void(mir::graphics::gbm::KMSOutput&, const mir::graphics::DisplayConfigurationOutput&)>&)::<lambda(const mir::graphics::gbm::KMSDisplayConfiguration&)> >::_M_invoke(const std::_Any_data &, const mir::graphics::gbm::KMSDisplayConfiguration &) (__functor=..., __args#0=...) at /usr/include/c++/12/bits/std_function.h:290
#26 0x00007f656dca5013 in std::function<void (mir::graphics::gbm::KMSDisplayConfiguration const&)>::operator()(mir::graphics::gbm::KMSDisplayConfiguration const&) const (this=0x7f63d17f8c10, __args#0=...) at /usr/include/c++/12/bits/std_function.h:591
#27 0x00007f656dc9d785 in KMSCurrentConfiguration::with_current_configuration_do(const std::function<void(const mir::graphics::gbm::KMSDisplayConfiguration&)> &) (this=0x5604ed860df0, exec=...) at /home/michal/dev/MirServer/mir/src/platforms/gbm-kms/server/kms/display.cpp:337
#28 0x00007f656dc8cf6f in mir::graphics::gbm::Cursor::for_each_used_output(std::function<void (mir::graphics::gbm::KMSOutput&, mir::graphics::DisplayConfigurationOutput const&)> const&) (this=0x5604ed9bccf0, f=...) at /home/michal/dev/MirServer/mir/src/platforms/gbm-kms/server/kms/cursor.cpp:336
#29 0x00007f656dc8d692 in mir::graphics::gbm::Cursor::place_cursor_at_locked(std::lock_guard<std::mutex> const&, mir::geometry::generic::Point<int>, mir::graphics::gbm::Cursor::ForceCursorState) (this=0x5604ed9bccf0, lg=..., position=..., force_state=mir::graphics::gbm::Cursor::ForceState) at /home/michal/dev/MirServer/mir/src/platforms/gbm-kms/server/kms/cursor.cpp:371
#30 0x00007f656dc8d022 in mir::graphics::gbm::Cursor::place_cursor_at(mir::geometry::generic::Point<int>, mir::graphics::gbm::Cursor::ForceCursorState) (this=0x5604ed9bccf0, position=..., force_state=mir::graphics::gbm::Cursor::ForceState) at /home/michal/dev/MirServer/mir/src/platforms/gbm-kms/server/kms/cursor.cpp:355
#31 0x00007f656dc8ccd4 in mir::graphics::gbm::Cursor::resume() (this=0x5604ed9bccf0) at /home/michal/dev/MirServer/mir/src/platforms/gbm-kms/server/kms/cursor.cpp:323
#32 0x00007f656dc9d164 in mir::graphics::gbm::Display::configure(mir::graphics::DisplayConfiguration const&) (this=0x5604ed6384e0, conf=...) at /home/michal/dev/MirServer/mir/src/platforms/gbm-kms/server/kms/display.cpp:263
#33 0x00007f6570122341 in mir::scene::MediatingDisplayChanger::apply_config(std::shared_ptr<mir::graphics::DisplayConfiguration> const&) (this=0x5604ee19cee0, conf=std::shared_ptr<mir::graphics::DisplayConfiguration> (use count 1, weak count 0) = {...}) at /home/michal/dev/MirServer/mir/src/server/scene/mediating_display_changer.cpp:397
#34 0x00007f6570123038 in mir::scene::MediatingDisplayChanger::set_power_mode(MirPowerMode) (this=0x5604ee19cee0, new_power_mode=mir_power_mode_off) at /home/michal/dev/MirServer/mir/src/server/scene/mediating_display_changer.cpp:533
#35 0x00007f65703313b2 in (anonymous namespace)::PowerModeSetter::idle() (this=0x5604ee1df320) at /home/michal/dev/MirServer/mir/src/server/shell/basic_idle_handler.cpp:142
#36 0x00007f65701767eb in std::__invoke_impl<void, void (mir::scene::IdleStateObserver::* const&)(), mir::ObserverMultiplexer<mir::scene::IdleStateObserver>::WeakObserver::LockedObserver&>(std::__invoke_memfun_deref, void (mir::scene::IdleStateObserver::* const&)(), mir::ObserverMultiplexer<mir::scene::IdleStateObserver>::WeakObserver::LockedObserver&) (__f=@0x7f63b0000cc0: &virtual mir::scene::IdleStateObserver::idle(), __t=...) at /usr/include/c++/12/bits/invoke.h:74
#37 0x00007f6570174f30 in std::__invoke<void (mir::scene::IdleStateObserver::* const&)(), mir::ObserverMultiplexer<mir::scene::IdleStateObserver>::WeakObserver::LockedObserver&>(void (mir::scene::IdleStateObserver::* const&)(), mir::ObserverMultiplexer<mir::scene::IdleStateObserver>::WeakObserver::LockedObserver&) (__fn=@0x7f63b0000cc0: &virtual mir::scene::IdleStateObserver::idle()) at /usr/include/c++/12/bits/invoke.h:96
#38 0x00007f6570173178 in std::_Mem_fn_base<void (mir::scene::IdleStateObserver::*)(), true>::operator()<mir::ObserverMultiplexer<mir::scene::IdleStateObserver>::WeakObserver::LockedObserver&>(mir::ObserverMultiplexer<mir::scene::IdleStateObserver>::WeakObserver::LockedObserver&) const (this=0x7f63b0000cc0) at /usr/include/c++/12/functional:167
#39 0x00007f657017157f in mir::ObserverMultiplexer<mir::scene::IdleStateObserver>::for_each_observer<void (mir::scene::IdleStateObserver::*)()>(void (mir::scene::IdleStateObserver::*)())::{lambda()#1}::operator()() (__closure=0x7f63b0000cc0) at /home/michal/dev/MirServer/mir/src/include/server/mir/observer_multiplexer.h:243
#40 0x00007f6570177d96 in std::__invoke_impl<void, mir::ObserverMultiplexer<mir::scene::IdleStateObserver>::for_each_observer<void (mir::scene::IdleStateObserver::*)()>(void (mir::scene::IdleStateObserver::*)())::{lambda()#1}&>(std::__invoke_other, mir::ObserverMultiplexer<mir::scene::IdleStateObserver>::for_each_observer<void (mir::scene::IdleStateObserver::*)()>(void (mir::scene::IdleStateObserver::*)())::{lambda()#1}&) (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#41 0x00007f6570176a72 in std::__invoke_r<void, mir::ObserverMultiplexer<mir::scene::IdleStateObserver>::for_each_observer<void (mir::scene::IdleStateObserver::*)()>(void (mir::scene::IdleStateObserver::*)())::{lambda()#1}&>(mir::ObserverMultiplexer<mir::scene::IdleStateObserver>::for_each_observer<void (mir::scene::IdleStateObserver::*)()>(void (mir::scene::IdleStateObserver::*)())::{lambda()#1}&) (__fn=...) at /usr/include/c++/12/bits/invoke.h:111
#42 0x00007f6570175111 in std::_Function_handler<void (), mir::ObserverMultiplexer<mir::scene::IdleStateObserver>::for_each_observer<void (mir::scene::IdleStateObserver::*)()>(void (mir::scene::IdleStateObserver::*)())::{lambda()#1}>::_M_invoke(std::_Any_data const&) (__functor=...) at /usr/include/c++/12/bits/std_function.h:290
#43 0x00007f656fe38b4a in std::function<void ()>::operator()() const (this=0x7f63d17f9100) at /usr/include/c++/12/bits/std_function.h:591
#44 0x00007f656fe5871d in (anonymous namespace)::LinearisingAdaptor::work_loop() (this=0x7f656fe9d260 <(anonymous namespace)::adaptor>) at /home/michal/dev/MirServer/mir/src/common/linearising_executor.cpp:66
#45 0x00007f656fe5856f in operator()() const (__closure=0x7f63c4067280) at /home/michal/dev/MirServer/mir/src/common/linearising_executor.cpp:50
#46 0x00007f656fe58aec in std::__invoke_impl<void, (anonymous namespace)::LinearisingAdaptor::spawn(std::function<void()>&&)::<lambda()>&>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#47 0x00007f656fe589d3 in std::__invoke_r<void, (anonymous namespace)::LinearisingAdaptor::spawn(std::function<void()>&&)::<lambda()>&>(struct {...} &) (__fn=...) at /usr/include/c++/12/bits/invoke.h:111
#48 0x00007f656fe588c1 in std::_Function_handler<void(), (anonymous namespace)::LinearisingAdaptor::spawn(std::function<void()>&&)::<lambda()> >::_M_invoke(const std::_Any_data &) (__functor=...) at /usr/include/c++/12/bits/std_function.h:290
#49 0x00007f656fe38b4a in std::function<void ()>::operator()() const (this=0x7f63c4067280) at /usr/include/c++/12/bits/std_function.h:591
#50 0x00007f656fe5097f in operator()() (__closure=0x7f63c4067260) at /home/michal/dev/MirServer/mir/src/common/thread_pool_executor.cpp:266
#51 0x00007f656fe52fd4 in std::__invoke_impl<void, (anonymous namespace)::ThreadPool::spawn(std::function<void()>&&)::<lambda()>&>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/12/bits/invoke.h:61
#52 0x00007f656fe52723 in std::__invoke_r<void, (anonymous namespace)::ThreadPool::spawn(std::function<void()>&&)::<lambda()>&>(struct {...} &) (__fn=...) at /usr/include/c++/12/bits/invoke.h:111
#53 0x00007f656fe51e98 in std::_Function_handler<void(), (anonymous namespace)::ThreadPool::spawn(std::function<void()>&&)::<lambda()> >::_M_invoke(const std::_Any_data &) (__functor=...) at /usr/include/c++/12/bits/std_function.h:290
#54 0x00007f656fe38b4a in std::function<void ()>::operator()() const (this=0x7f63d17f92c0) at /usr/include/c++/12/bits/std_function.h:591
#55 0x00007f656fe50529 in (anonymous namespace)::Worker::work_loop((anonymous namespace)::Worker*, std::promise<std::atomic<bool>*>&&) (me=0x7f63c4052850, shutdown_channel=...) at /home/michal/dev/MirServer/mir/src/common/thread_pool_executor.cpp:184
#56 0x00007f656fe54069 in std::__invoke_impl<void, void (*)((anonymous namespace)::Worker*, std::promise<std::atomic<bool>*>&&), (anonymous namespace)::Worker*, std::promise<std::atomic<bool>*> >(std::__invoke_other, void (*&&)((anonymous namespace)::Worker*, std::promise<std::atomic<bool>*>&&)) (__f=@0x7f63c40215a8: 0x7f656fe5044d <(anonymous namespace)::Worker::work_loop((anonymous namespace)::Worker*, std::promise<std::atomic<bool>*>&&)>) at /usr/include/c++/12/bits/invoke.h:61
#57 0x00007f656fe53fdf in std::__invoke<void (*)((anonymous namespace)::Worker*, std::promise<std::atomic<bool>*>&&), (anonymous namespace)::Worker*, std::promise<std::atomic<bool>*> >(void (*&&)((anonymous namespace)::Worker*, std::promise<std::atomic<bool>*>&&)) (__fn=@0x7f63c40215a8: 0x7f656fe5044d <(anonymous namespace)::Worker::work_loop((anonymous namespace)::Worker*, std::promise<std::atomic<bool>*>&&)>) at /usr/include/c++/12/bits/invoke.h:96
#58 0x00007f656fe53ef7 in std::thread::_Invoker<std::tuple<void (*)((anonymous namespace)::Worker*, std::promise<std::atomic<bool>*>&&), (anonymous namespace)::Worker*, std::promise<std::atomic<bool>*> > >::_M_invoke<0, 1, 2>(std::_Index_tuple<0, 1, 2>) (this=0x7f63c4021588) at /usr/include/c++/12/bits/std_thread.h:252
#59 0x00007f656fe53e7a in std::thread::_Invoker<std::tuple<void (*)((anonymous namespace)::Worker*, std::promise<std::atomic<bool>*>&&), (anonymous namespace)::Worker*, std::promise<std::atomic<bool>*> > >::operator()() (this=0x7f63c4021588) at /usr/include/c++/12/bits/std_thread.h:259
#60 0x00007f656fe53e24 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)((anonymous namespace)::Worker*, std::promise<std::atomic<bool>*>&&), (anonymous namespace)::Worker*, std::promise<std::atomic<bool>*> > > >::_M_run() (this=0x7f63c4021580) at /usr/include/c++/12/bits/std_thread.h:210
#61 0x00007f65709643a3 in  () at /lib/x86_64-linux-gnu/libstdc++.so.6
#62 0x00007f65706f32a2 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#63 0x00007f6570782260 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81
@AlanGriffiths
Copy link
Contributor

Is this another case of connector being stale?

Apart from "shutdown" the system was quiet? Or where there apps active?

@Saviq
Copy link
Collaborator Author

Saviq commented Oct 7, 2022

Is this another case of connector being stale?

This was with #2684, so shouldn't be.

Apart from "shutdown" the system was quiet? Or where there apps active?

Yeah there were apps, I Ctrl+Alt+Backspaced to refresh to #2689.

@AlanGriffiths
Copy link
Contributor

This was with #2684, so shouldn't be.

That refreshed connector on one codepath through ensure_crtc(). This path isn't calling ensure_crtc() anywhere I've seen

bors bot added a commit that referenced this issue Oct 18, 2022
2691: Disconnected hardware has no modes: invent a size r=RAOF a=AlanGriffiths

In #2690, we're segfaulting trying to access the size of an output. Maybe this "fixes" it?

Marked as "draft" as it is experimental


Co-authored-by: Alan Griffiths <alan@octopull.co.uk>
Saviq pushed a commit that referenced this issue Oct 18, 2022
2691: Disconnected hardware has no modes: invent a size r=RAOF a=AlanGriffiths

In #2690, we're segfaulting trying to access the size of an output. Maybe this "fixes" it?

Marked as "draft" as it is experimental


Co-authored-by: Alan Griffiths <alan@octopull.co.uk>
@Saviq
Copy link
Collaborator Author

Saviq commented Oct 19, 2022

Fixed by #2691

@Saviq Saviq closed this as completed Oct 19, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants