Another exception on close, maybe not a crash? #15774

Open
opened 2026-01-31 04:48:01 +00:00 by claunia · 0 comments
Owner

Originally created by @zadjii-msft on GitHub (Nov 4, 2021).

This one seems to hit 100% for me in Debug builds, currently on 1167e20 but I'd bet this is in main.

Repro:

  • Open a debug Terminal in vs
  • Persist layouts is off, not sure it matters.
  • close the window with the 'x'
  • experience crash

Likely regressed in #11440, this line: https://github.com/microsoft/terminal/pull/11440/files#diff-d9af234d6dd21db9240dc3733d69471898a79f1c4386cb3c48ac45ab7158cd07R405

AppHost::LastTabClosed RESETS the _getWindowLayoutThrottler, then calls SignalClose(). That goes up and back down to the _windowManager.WindowClosed handler set up in AppHost::_BecomeMonarch. At this point, _getWindowLayoutThrottler DOESN'T HAVE A VALUE, so

_getWindowLayoutThrottler.value()()

causes a std::bad_optional_access exception.

I don't know if this is a crash, or just a first-chance exception that VS is reporting that doesn't matter. It's definitely a bug though.

Stack
 	WindowsTerminal.exe!<lambda_d14224e5f61d340d2454360bff63413e>::operator()<winrt::Windows::Foundation::IInspectable const &,winrt::Windows::Foundation::IInspectable const &>(const winrt::Windows::Foundation::IInspectable & __formal, const winrt::Windows::Foundation::IInspectable & __formal) Line 818	C++
 	WindowsTerminal.exe!winrt::impl::delegate<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>,<lambda_d14224e5f61d340d2454360bff63413e>>::Invoke(void * sender, void * args) Line 895	C++
 	Microsoft.Terminal.Remoting.dll!winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>::operator()(const winrt::Windows::Foundation::IInspectable & sender, const winrt::Windows::Foundation::IInspectable & args) Line 2525	C++
 	Microsoft.Terminal.Remoting.dll!winrt::impl::invoke<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>,winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>(const winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable> & delegate, const winrt::Windows::Foundation::IInspectable & <args_0>, const winrt::Windows::Foundation::IInspectable & <args_1>) Line 5762	C++
 	Microsoft.Terminal.Remoting.dll!winrt::event<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>>::operator()<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>(const winrt::Windows::Foundation::IInspectable & <args_0>, const winrt::Windows::Foundation::IInspectable & <args_1>) Line 5897	C++
 	Microsoft.Terminal.Remoting.dll!<lambda_feabb5633168b9dfc8d0e9799de5ebe0>::operator()<winrt::Windows::Foundation::IInspectable const &,winrt::Windows::Foundation::IInspectable const &>(const winrt::Windows::Foundation::IInspectable & <args_0>, const winrt::Windows::Foundation::IInspectable & <args_1>) Line 2520	C++
 	Microsoft.Terminal.Remoting.dll!winrt::impl::delegate<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>,<lambda_feabb5633168b9dfc8d0e9799de5ebe0>>::Invoke(void * sender, void * args) Line 895	C++
 	Microsoft.Terminal.Remoting.dll!winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>::operator()(const winrt::Windows::Foundation::IInspectable & sender, const winrt::Windows::Foundation::IInspectable & args) Line 2525	C++
 	Microsoft.Terminal.Remoting.dll!winrt::impl::invoke<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>,std::nullptr_t,std::nullptr_t>(const winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable> & delegate, void * const & <args_0>, void * const & <args_1>) Line 5762	C++
 	Microsoft.Terminal.Remoting.dll!winrt::event<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>>::operator()<std::nullptr_t,std::nullptr_t>(void * const & <args_0>, void * const & <args_1>) Line 5897	C++
 	Microsoft.Terminal.Remoting.dll!winrt::Microsoft::Terminal::Remoting::implementation::Monarch::SignalClose(const unsigned __int64 peasantId) Line 212	C++
 	Microsoft.Terminal.Remoting.dll!winrt::impl::produce<winrt::Microsoft::Terminal::Remoting::implementation::Monarch,winrt::Microsoft::Terminal::Remoting::IMonarch>::SignalClose(unsigned __int64 peasantId) Line 999	C++
 	Microsoft.Terminal.Remoting.dll!winrt::impl::consume_Microsoft_Terminal_Remoting_IMonarch<winrt::Microsoft::Terminal::Remoting::IMonarch>::SignalClose(unsigned __int64 peasantId) Line 117	C++
 	Microsoft.Terminal.Remoting.dll!winrt::Microsoft::Terminal::Remoting::implementation::WindowManager::SignalClose() Line 74	C++
 	Microsoft.Terminal.Remoting.dll!winrt::impl::produce<winrt::Microsoft::Terminal::Remoting::implementation::WindowManager,winrt::Microsoft::Terminal::Remoting::IWindowManager>::SignalClose() Line 1710	C++
 	WindowsTerminal.exe!winrt::impl::consume_Microsoft_Terminal_Remoting_IWindowManager<winrt::Microsoft::Terminal::Remoting::IWindowManager>::SignalClose() Line 655	C++
>	WindowsTerminal.exe!AppHost::LastTabClosed(const winrt::Windows::Foundation::IInspectable & __formal, const winrt::TerminalApp::LastTabClosedEventArgs & __formal) Line 412	C++
 	WindowsTerminal.exe!<lambda_3930e0e5f7a1efe801e738623725cca1>::operator()<winrt::Windows::Foundation::IInspectable const &,winrt::TerminalApp::LastTabClosedEventArgs const &>(const winrt::Windows::Foundation::IInspectable & <args_0>, const winrt::TerminalApp::LastTabClosedEventArgs & <args_1>) Line 2512	C++
 	WindowsTerminal.exe!winrt::impl::delegate<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::TerminalApp::LastTabClosedEventArgs>,<lambda_3930e0e5f7a1efe801e738623725cca1>>::Invoke(void * sender, void * args) Line 895	C++
 	TerminalApp.dll!winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::TerminalApp::LastTabClosedEventArgs>::operator()(const winrt::Windows::Foundation::IInspectable & sender, const winrt::TerminalApp::LastTabClosedEventArgs & args) Line 2525	C++
 	TerminalApp.dll!winrt::impl::invoke<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::TerminalApp::LastTabClosedEventArgs>,winrt::TerminalApp::implementation::TerminalPage,std::nullptr_t>(const winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::TerminalApp::LastTabClosedEventArgs> & delegate, const winrt::TerminalApp::implementation::TerminalPage & <args_0>, void * const & <args_1>) Line 5762	C++
 	TerminalApp.dll!winrt::event<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::TerminalApp::LastTabClosedEventArgs>>::operator()<winrt::TerminalApp::implementation::TerminalPage,std::nullptr_t>(const winrt::TerminalApp::implementation::TerminalPage & <args_0>, void * const & <args_1>) Line 5897	C++
 	TerminalApp.dll!winrt::TerminalApp::implementation::TerminalPage::_RemoveTab(const winrt::TerminalApp::TabBase & tab) Line 528	C++
 	TerminalApp.dll!winrt::TerminalApp::implementation::TerminalPage::_HandleCloseTabRequested$_ResumeCoro$1() Line 478	C++
 	[External Code]	
 	TerminalApp.dll!winrt::TerminalApp::implementation::TerminalPage::_RemoveTabs$_ResumeCoro$1() Line 814	C++
 	[External Code]	
 	TerminalApp.dll!winrt::TerminalApp::implementation::TerminalPage::_RemoveAllTabs() Line 1053	C++
 	TerminalApp.dll!winrt::TerminalApp::implementation::TerminalPage::CloseWindow$_ResumeCoro$1() Line 1406	C++
 	[External Code]	
 	TerminalApp.dll!winrt::TerminalApp::implementation::AppLogic::CloseWindow(winrt::Microsoft::Terminal::Settings::Model::LaunchPosition pos) Line 1178	C++
 	TerminalApp.dll!winrt::impl::produce<winrt::TerminalApp::implementation::AppLogic,winrt::TerminalApp::IAppLogic>::CloseWindow(winrt::impl::struct_Microsoft_Terminal_Settings_Model_LaunchPosition position) Line 2764	C++
 	WindowsTerminal.exe!winrt::impl::consume_TerminalApp_IAppLogic<winrt::TerminalApp::IAppLogic>::CloseWindow(const winrt::Microsoft::Terminal::Settings::Model::LaunchPosition & position) Line 245	C++
 	WindowsTerminal.exe!AppHost::Initialize::__l2::<lambda>() Line 310	C++
 	WindowsTerminal.exe!winrt::impl::variadic_delegate<void <lambda>(void),void>::invoke() Line 5316	C++
 	WindowsTerminal.exe!winrt::impl::delegate_base<void>::operator()() Line 5385	C++
 	WindowsTerminal.exe!winrt::impl::invoke<winrt::delegate<>>(const winrt::delegate<> & delegate) Line 5762	C++
 	WindowsTerminal.exe!winrt::event<winrt::delegate<>>::operator()<>() Line 5897	C++
 	WindowsTerminal.exe!IslandWindow::MessageHandler(const unsigned int message, const unsigned __int64 wparam, const __int64 lparam) Line 493	C++
 	WindowsTerminal.exe!NonClientIslandWindow::MessageHandler(const unsigned int message, const unsigned __int64 wParam, const __int64 lParam) Line 910	C++
 	WindowsTerminal.exe!BaseWindow<IslandWindow>::WndProc(HWND__ * const window, const unsigned int message, const unsigned __int64 wparam, const __int64 lparam) Line 35	C++
 	[External Code]	
 	WindowsTerminal.exe!BaseWindow<IslandWindow>::MessageHandler(const unsigned int message, const unsigned __int64 wparam, const __int64 lparam) Line 97	C++
 	WindowsTerminal.exe!IslandWindow::MessageHandler(const unsigned int message, const unsigned __int64 wparam, const __int64 lparam) Line 625	C++
 	WindowsTerminal.exe!NonClientIslandWindow::MessageHandler(const unsigned int message, const unsigned __int64 wParam, const __int64 lParam) Line 910	C++
 	WindowsTerminal.exe!BaseWindow<IslandWindow>::WndProc(HWND__ * const window, const unsigned int message, const unsigned __int64 wparam, const __int64 lparam) Line 35	C++
 	[External Code]	
 	WindowsTerminal.exe!wWinMain(HINSTANCE__ * __formal, HINSTANCE__ * __formal, wchar_t * __formal, int __formal) Line 198	C++
 	[External Code]	

Originally created by @zadjii-msft on GitHub (Nov 4, 2021). This one seems to hit 100% for me in Debug builds, currently on 1167e20 but I'd bet this is in `main`. Repro: * Open a debug Terminal in vs * Persist layouts is off, not sure it matters. * close the window with the 'x' * experience crash Likely regressed in #11440, this line: https://github.com/microsoft/terminal/pull/11440/files#diff-d9af234d6dd21db9240dc3733d69471898a79f1c4386cb3c48ac45ab7158cd07R405 `AppHost::LastTabClosed` RESETS the `_getWindowLayoutThrottler`, then calls `SignalClose()`. That goes up and back down to the `_windowManager.WindowClosed` handler set up in `AppHost::_BecomeMonarch`. At this point, `_getWindowLayoutThrottler` DOESN'T HAVE A VALUE, so ```c++ _getWindowLayoutThrottler.value()() ``` causes a `std::bad_optional_access` exception. I don't know if this is a _crash_, or just a first-chance exception that VS is reporting that doesn't matter. It's definitely a bug though. <details> <summary>Stack</summary> ``` WindowsTerminal.exe!<lambda_d14224e5f61d340d2454360bff63413e>::operator()<winrt::Windows::Foundation::IInspectable const &,winrt::Windows::Foundation::IInspectable const &>(const winrt::Windows::Foundation::IInspectable & __formal, const winrt::Windows::Foundation::IInspectable & __formal) Line 818 C++ WindowsTerminal.exe!winrt::impl::delegate<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>,<lambda_d14224e5f61d340d2454360bff63413e>>::Invoke(void * sender, void * args) Line 895 C++ Microsoft.Terminal.Remoting.dll!winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>::operator()(const winrt::Windows::Foundation::IInspectable & sender, const winrt::Windows::Foundation::IInspectable & args) Line 2525 C++ Microsoft.Terminal.Remoting.dll!winrt::impl::invoke<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>,winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>(const winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable> & delegate, const winrt::Windows::Foundation::IInspectable & <args_0>, const winrt::Windows::Foundation::IInspectable & <args_1>) Line 5762 C++ Microsoft.Terminal.Remoting.dll!winrt::event<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>>::operator()<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>(const winrt::Windows::Foundation::IInspectable & <args_0>, const winrt::Windows::Foundation::IInspectable & <args_1>) Line 5897 C++ Microsoft.Terminal.Remoting.dll!<lambda_feabb5633168b9dfc8d0e9799de5ebe0>::operator()<winrt::Windows::Foundation::IInspectable const &,winrt::Windows::Foundation::IInspectable const &>(const winrt::Windows::Foundation::IInspectable & <args_0>, const winrt::Windows::Foundation::IInspectable & <args_1>) Line 2520 C++ Microsoft.Terminal.Remoting.dll!winrt::impl::delegate<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>,<lambda_feabb5633168b9dfc8d0e9799de5ebe0>>::Invoke(void * sender, void * args) Line 895 C++ Microsoft.Terminal.Remoting.dll!winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>::operator()(const winrt::Windows::Foundation::IInspectable & sender, const winrt::Windows::Foundation::IInspectable & args) Line 2525 C++ Microsoft.Terminal.Remoting.dll!winrt::impl::invoke<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>,std::nullptr_t,std::nullptr_t>(const winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable> & delegate, void * const & <args_0>, void * const & <args_1>) Line 5762 C++ Microsoft.Terminal.Remoting.dll!winrt::event<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::Windows::Foundation::IInspectable>>::operator()<std::nullptr_t,std::nullptr_t>(void * const & <args_0>, void * const & <args_1>) Line 5897 C++ Microsoft.Terminal.Remoting.dll!winrt::Microsoft::Terminal::Remoting::implementation::Monarch::SignalClose(const unsigned __int64 peasantId) Line 212 C++ Microsoft.Terminal.Remoting.dll!winrt::impl::produce<winrt::Microsoft::Terminal::Remoting::implementation::Monarch,winrt::Microsoft::Terminal::Remoting::IMonarch>::SignalClose(unsigned __int64 peasantId) Line 999 C++ Microsoft.Terminal.Remoting.dll!winrt::impl::consume_Microsoft_Terminal_Remoting_IMonarch<winrt::Microsoft::Terminal::Remoting::IMonarch>::SignalClose(unsigned __int64 peasantId) Line 117 C++ Microsoft.Terminal.Remoting.dll!winrt::Microsoft::Terminal::Remoting::implementation::WindowManager::SignalClose() Line 74 C++ Microsoft.Terminal.Remoting.dll!winrt::impl::produce<winrt::Microsoft::Terminal::Remoting::implementation::WindowManager,winrt::Microsoft::Terminal::Remoting::IWindowManager>::SignalClose() Line 1710 C++ WindowsTerminal.exe!winrt::impl::consume_Microsoft_Terminal_Remoting_IWindowManager<winrt::Microsoft::Terminal::Remoting::IWindowManager>::SignalClose() Line 655 C++ > WindowsTerminal.exe!AppHost::LastTabClosed(const winrt::Windows::Foundation::IInspectable & __formal, const winrt::TerminalApp::LastTabClosedEventArgs & __formal) Line 412 C++ WindowsTerminal.exe!<lambda_3930e0e5f7a1efe801e738623725cca1>::operator()<winrt::Windows::Foundation::IInspectable const &,winrt::TerminalApp::LastTabClosedEventArgs const &>(const winrt::Windows::Foundation::IInspectable & <args_0>, const winrt::TerminalApp::LastTabClosedEventArgs & <args_1>) Line 2512 C++ WindowsTerminal.exe!winrt::impl::delegate<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::TerminalApp::LastTabClosedEventArgs>,<lambda_3930e0e5f7a1efe801e738623725cca1>>::Invoke(void * sender, void * args) Line 895 C++ TerminalApp.dll!winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::TerminalApp::LastTabClosedEventArgs>::operator()(const winrt::Windows::Foundation::IInspectable & sender, const winrt::TerminalApp::LastTabClosedEventArgs & args) Line 2525 C++ TerminalApp.dll!winrt::impl::invoke<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::TerminalApp::LastTabClosedEventArgs>,winrt::TerminalApp::implementation::TerminalPage,std::nullptr_t>(const winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::TerminalApp::LastTabClosedEventArgs> & delegate, const winrt::TerminalApp::implementation::TerminalPage & <args_0>, void * const & <args_1>) Line 5762 C++ TerminalApp.dll!winrt::event<winrt::Windows::Foundation::TypedEventHandler<winrt::Windows::Foundation::IInspectable,winrt::TerminalApp::LastTabClosedEventArgs>>::operator()<winrt::TerminalApp::implementation::TerminalPage,std::nullptr_t>(const winrt::TerminalApp::implementation::TerminalPage & <args_0>, void * const & <args_1>) Line 5897 C++ TerminalApp.dll!winrt::TerminalApp::implementation::TerminalPage::_RemoveTab(const winrt::TerminalApp::TabBase & tab) Line 528 C++ TerminalApp.dll!winrt::TerminalApp::implementation::TerminalPage::_HandleCloseTabRequested$_ResumeCoro$1() Line 478 C++ [External Code] TerminalApp.dll!winrt::TerminalApp::implementation::TerminalPage::_RemoveTabs$_ResumeCoro$1() Line 814 C++ [External Code] TerminalApp.dll!winrt::TerminalApp::implementation::TerminalPage::_RemoveAllTabs() Line 1053 C++ TerminalApp.dll!winrt::TerminalApp::implementation::TerminalPage::CloseWindow$_ResumeCoro$1() Line 1406 C++ [External Code] TerminalApp.dll!winrt::TerminalApp::implementation::AppLogic::CloseWindow(winrt::Microsoft::Terminal::Settings::Model::LaunchPosition pos) Line 1178 C++ TerminalApp.dll!winrt::impl::produce<winrt::TerminalApp::implementation::AppLogic,winrt::TerminalApp::IAppLogic>::CloseWindow(winrt::impl::struct_Microsoft_Terminal_Settings_Model_LaunchPosition position) Line 2764 C++ WindowsTerminal.exe!winrt::impl::consume_TerminalApp_IAppLogic<winrt::TerminalApp::IAppLogic>::CloseWindow(const winrt::Microsoft::Terminal::Settings::Model::LaunchPosition & position) Line 245 C++ WindowsTerminal.exe!AppHost::Initialize::__l2::<lambda>() Line 310 C++ WindowsTerminal.exe!winrt::impl::variadic_delegate<void <lambda>(void),void>::invoke() Line 5316 C++ WindowsTerminal.exe!winrt::impl::delegate_base<void>::operator()() Line 5385 C++ WindowsTerminal.exe!winrt::impl::invoke<winrt::delegate<>>(const winrt::delegate<> & delegate) Line 5762 C++ WindowsTerminal.exe!winrt::event<winrt::delegate<>>::operator()<>() Line 5897 C++ WindowsTerminal.exe!IslandWindow::MessageHandler(const unsigned int message, const unsigned __int64 wparam, const __int64 lparam) Line 493 C++ WindowsTerminal.exe!NonClientIslandWindow::MessageHandler(const unsigned int message, const unsigned __int64 wParam, const __int64 lParam) Line 910 C++ WindowsTerminal.exe!BaseWindow<IslandWindow>::WndProc(HWND__ * const window, const unsigned int message, const unsigned __int64 wparam, const __int64 lparam) Line 35 C++ [External Code] WindowsTerminal.exe!BaseWindow<IslandWindow>::MessageHandler(const unsigned int message, const unsigned __int64 wparam, const __int64 lparam) Line 97 C++ WindowsTerminal.exe!IslandWindow::MessageHandler(const unsigned int message, const unsigned __int64 wparam, const __int64 lparam) Line 625 C++ WindowsTerminal.exe!NonClientIslandWindow::MessageHandler(const unsigned int message, const unsigned __int64 wParam, const __int64 lParam) Line 910 C++ WindowsTerminal.exe!BaseWindow<IslandWindow>::WndProc(HWND__ * const window, const unsigned int message, const unsigned __int64 wparam, const __int64 lparam) Line 35 C++ [External Code] WindowsTerminal.exe!wWinMain(HINSTANCE__ * __formal, HINSTANCE__ * __formal, wchar_t * __formal, int __formal) Line 198 C++ [External Code] ``` </details>
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/terminal#15774