pixiple_x64.exe!std::_Associated_state<int>::_Set_exception(std::exception_ptr _Exc, bool _At_thread_exit) Line 334 C++
pixiple_x64.exe!`std::_Packaged_state<void __cdecl(void)>::_Call_immediate'::`1'::catch$1() Line 596 C++
pixiple_x64.exe!_CallSettingFrame_LookupContinuationIndex() Line 98 Unknown
pixiple_x64.exe!__FrameHandler4::CxxCallCatchBlock(_EXCEPTION_RECORD * pExcept) Line 1393 C++
ntdll.dll!00007ffd332917a6() Unknown
pixiple_x64.exe!std::_Packaged_state<void __cdecl(void)>::_Call_immediate() Line 593 C++
pixiple_x64.exe!`std::_Task_async_state<void>::_Task_async_state<void><std::_Fake_no_copy_callable_adapter<void (__cdecl Pane::*)(ID2D1HwndRenderTarget *)const ,Pane const *,_com_ptr_t<_com_IIID<ID2D1HwndRenderTarget,&_GUID_2cd90698_12e2_11dc_9fed_001143a055f9>> &>>'::`2'::<lambda_1>::operator()() Line 674 C++
pixiple_x64.exe!std::invoke<`std::_Task_async_state<void>::_Task_async_state<void><std::_Fake_no_copy_callable_adapter<void (__cdecl Pane::*)(ID2D1HwndRenderTarget *)const ,Pane const *,_com_ptr_t<_com_IIID<ID2D1HwndRenderTarget,&_GUID_2cd90698_12e2_11dc_9fed_001143a055f9>> &>>'::`2'::<lambda_1> &>(std::_Task_async_state<void>::{ctor}::__l2::<lambda_1> & _Obj) Line 1525 C++
pixiple_x64.exe!std::_Invoker_ret<void,1>::_Call<`std::_Task_async_state<void>::_Task_async_state<void><std::_Fake_no_copy_callable_adapter<void (__cdecl Pane::*)(ID2D1HwndRenderTarget *)const ,Pane const *,_com_ptr_t<_com_IIID<ID2D1HwndRenderTarget,&_GUID_2cd90698_12e2_11dc_9fed_001143a055f9>> &>>'::`2'::<lambda_1> &>(std::_Task_async_state<void>::{ctor}::__l2::<lambda_1> & _Func) Line 652 C++
pixiple_x64.exe!std::_Func_impl_no_alloc<`std::_Task_async_state<void>::_Task_async_state<void><std::_Fake_no_copy_callable_adapter<void (__cdecl Pane::*)(ID2D1HwndRenderTarget *)const ,Pane const *,_com_ptr_t<_com_IIID<ID2D1HwndRenderTarget,&_GUID_2cd90698_12e2_11dc_9fed_001143a055f9>> &>>'::`2'::<lambda_1>,void>::_Do_call() Line 823 C++
pixiple_x64.exe!std::_Func_class<void>::operator()() Line 870 C++
pixiple_x64.exe!`Concurrency::details::_MakeVoidToUnitFunc'::`2'::<lambda_1>::operator()() Line 2348 C++
pixiple_x64.exe!std::invoke<`Concurrency::details::_MakeVoidToUnitFunc'::`2'::<lambda_1> &>(Concurrency::details::_MakeVoidToUnitFunc::__l2::<lambda_1> & _Obj) Line 1525 C++
pixiple_x64.exe!std::_Invoker_ret<unsigned char,0>::_Call<`Concurrency::details::_MakeVoidToUnitFunc'::`2'::<lambda_1> &>(Concurrency::details::_MakeVoidToUnitFunc::__l2::<lambda_1> & _Func) Line 661 C++
pixiple_x64.exe!std::_Func_impl_no_alloc<`Concurrency::details::_MakeVoidToUnitFunc'::`2'::<lambda_1>,unsigned char>::_Do_call() Line 823 C++
pixiple_x64.exe!std::_Func_class<unsigned char>::operator()() Line 870 C++
pixiple_x64.exe!Concurrency::task<unsigned char>::_InitialTaskHandle<void,`std::_Task_async_state<void>::_Task_async_state<void><std::_Fake_no_copy_callable_adapter<void (__cdecl Pane::*)(ID2D1HwndRenderTarget *)const ,Pane const *,_com_ptr_t<_com_IIID<ID2D1HwndRenderTarget,&_GUID_2cd90698_12e2_11dc_9fed_001143a055f9>> &>>'::`2'::<lambda_1>,Concurrency::details::_TypeSelectorNoAsync>::_LogWorkItemAndInvokeUserLambda<std::function<unsigned char __cdecl(void)>>(std::function<unsigned char __cdecl(void)> _func) Line 3513 C++
pixiple_x64.exe!Concurrency::task<unsigned char>::_InitialTaskHandle<void,`std::_Task_async_state<void>::_Task_async_state<void><std::_Fake_no_copy_callable_adapter<void (__cdecl Pane::*)(ID2D1HwndRenderTarget *)const ,Pane const *,_com_ptr_t<_com_IIID<ID2D1HwndRenderTarget,&_GUID_2cd90698_12e2_11dc_9fed_001143a055f9>> &>>'::`2'::<lambda_1>,Concurrency::details::_TypeSelectorNoAsync>::_Init(Concurrency::details::_TypeSelectorNoAsync __formal) Line 3533 C++
pixiple_x64.exe!Concurrency::task<unsigned char>::_InitialTaskHandle<void,`std::_Task_async_state<void>::_Task_async_state<void><std::_Fake_no_copy_callable_adapter<void (__cdecl Pane::*)(ID2D1HwndRenderTarget *)const ,Pane const *,_com_ptr_t<_com_IIID<ID2D1HwndRenderTarget,&_GUID_2cd90698_12e2_11dc_9fed_001143a055f9>> &>>'::`2'::<lambda_1>,Concurrency::details::_TypeSelectorNoAsync>::_Perform() Line 3519 C++
pixiple_x64.exe!Concurrency::details::_PPLTaskHandle<unsigned char,Concurrency::task<unsigned char>::_InitialTaskHandle<void,`std::_Task_async_state<void>::_Task_async_state<void><std::_Fake_no_copy_callable_adapter<void (__cdecl Pane::*)(ID2D1HwndRenderTarget *)const ,Pane const *,_com_ptr_t<_com_IIID<ID2D1HwndRenderTarget,&_GUID_2cd90698_12e2_11dc_9fed_001143a055f9>> &>>'::`2'::<lambda_1>,Concurrency::details::_TypeSelectorNoAsync>,Concurrency::details::_TaskProcHandle>::invoke() Line 1469 C++
pixiple_x64.exe!Concurrency::details::_TaskProcHandle::_RunChoreBridge(void * _Parameter) Line 158 C++
pixiple_x64.exe!Concurrency::details::_DefaultPPLTaskScheduler::_PPLTaskChore::_Callback(void * _Args) Line 51 C++
> pixiple_x64.exe!Concurrency::details::`anonymous namespace'::_Task_scheduler_callback(_TP_CALLBACK_INSTANCE * _Pci, void * _Args, _TP_WORK * __formal) Line 133 C++
ntdll.dll!00007ffd33252260() Unknown
ntdll.dll!00007ffd332431aa() Unknown
kernel32.dll!00007ffd32467614() Unknown
ntdll.dll!00007ffd332426a1() Unknown
[Async Call]
[External Code]
pixiple_x64.exe!Window::paint() Line 612 C++
pixiple_x64.exe!Window::window_procedure(HWND__ * hwnd, unsigned int msg, unsigned __int64 wparam, __int64 lparam) Line 465 C++
pixiple_x64.exe!Window::static_window_procedure(HWND__ * hwnd, unsigned int msg, unsigned __int64 wparam, __int64 lparam) Line 399 C++
[External Code]
As you can see, we're crashing in std lib. It's unclear what exactly is causing the crash because Window::paint()
is using std::future
to execute Pane::draw()
asynchronously. std::future
captures and re-throws any exception in the asynchronous routine, so we won't be able to catch original location where the exception occurred.
If we change Visual Studio's exception settings to break when all exceptions are thrown, the stack now becomes:
KernelBase.dll!00007ffd30bbcd29() Unknown
[External Code]
> pixiple_x64.exe!ErrorReflector::throw_result(const long line, const char * const file, const HRESULT hresult) Line 102 C++
pixiple_x64.exe!ErrorReflector::operator=(const HRESULT & hr) Line 69 C++
pixiple_x64.exe!Image::get_bitmap(ID2D1HwndRenderTarget * const render_target) Line 838 C++
pixiple_x64.exe!Image::draw(ID2D1HwndRenderTarget * const render_target, const D2D_RECT_F & rect_dest, const D2D_RECT_F & rect_src, const D2D1_BITMAP_INTERPOLATION_MODE & interpolation_mode) Line 113 C++
pixiple_x64.exe!Pane::draw(ID2D1HwndRenderTarget * const render_target) Line 426 C++
[External Code]
[Async Call]
[External Code]
pixiple_x64.exe!Window::paint() Line 612 C++
pixiple_x64.exe!Window::window_procedure(HWND__ * hwnd, unsigned int msg, unsigned __int64 wparam, __int64 lparam) Line 465 C++
pixiple_x64.exe!Window::static_window_procedure(HWND__ * hwnd, unsigned int msg, unsigned __int64 wparam, __int64 lparam) Line 399 C++
[External Code]
Now it's clear what's causing the problem. Image::get_bitmap()
uses ErrorReflector
to handle all Windows API errors. ErrorReflector
throws exceptions when it sees an error - this is what's causing the crash.