Skip to content

ScreenCaptureforHWND sample main thread hang #131

@ollie-dawes

Description

@ollie-dawes

Background:

I am working on a C++ screen capture application and have been running into a few issues. One issue is occasionally our application hangs when we are tearing down our display capture logic. When I pause our application in the debugger I get the following trace for the main thread (cannot share full trace as it is a closed source product):

win32u.dll!00007ffc6ebca104() (Unknown Source:0)
user32.dll!00007ffc707a0dee() (Unknown Source:0)
combase.dll!00007ffc70ca2f99() (Unknown Source:0)
combase.dll!00007ffc70ca2dcb() (Unknown Source:0)
combase.dll!00007ffc70cacdb6() (Unknown Source:0)
combase.dll!00007ffc70cf9c03() (Unknown Source:0)
combase.dll!00007ffc70cab71b() (Unknown Source:0)
combase.dll!00007ffc70ca2a24() (Unknown Source:0)
combase.dll!00007ffc70cf937e() (Unknown Source:0)
rpcrt4.dll!00007ffc6fc4dc24() (Unknown Source:0)
combase.dll!00007ffc70cf71e8() (Unknown Source:0)
combase.dll!00007ffc70d6f0b2() (Unknown Source:0)
GraphicsCapture.dll!00007ffc3f012ff5() (Unknown Source:0)
GraphicsCapture.dll!00007ffc3f00afa0() (Unknown Source:0)
GraphicsCapture.dll!00007ffc3f00ac14() (Unknown Source:0)
GraphicsCapture.dll!00007ffc3f00acb4() (Unknown Source:0)
GraphicsCapture.dll!00007ffc3f00b5d8() (Unknown Source:0)
AppName.exe!Microsoft::WRL::ComPtr<ABI::Windows::Graphics::Capture::IGraphicsCaptureSession>::InternalRelease() Line 235 (c:\Users\<user>\redacted_path\winsdk-x64-min\Windows Kits\10\Include\10.0.22621.0\winrt\wrl\client.h:235)
AppName.exe!Microsoft::WRL::ComPtr<ABI::Windows::Graphics::Capture::IGraphicsCaptureSession>::~ComPtr() Line 291 (c:\Users\<user>\redacted_path\winsdk-x64-min\Windows Kits\10\Include\10.0.22621.0\winrt\wrl\client.h:291)

It looks like our IGraphicsCaptureSession is hanging when we delete the owning ComPtr.

I decided to pull down the ScreenCaptureforHWND sample from this repo to see if I could reproduce the issue and I was able to reproduce the problem. Pausing the sample in Visual studio after getting into the hung state gives the following trace on the main thread:

 	[External Code]	
->	ScreenCaptureforHWND.exe!winrt::impl::consume_Windows_Foundation_IClosable<winrt::Windows::Graphics::Capture::GraphicsCaptureSession>::Close() Line 121	C++
 	ScreenCaptureforHWND.exe!SimpleCapture::Close() Line 85	C++
 	ScreenCaptureforHWND.exe!App::StartCapture(HWND__ * hwnd) Line 62	C++
 	ScreenCaptureforHWND.exe!WndProc(HWND__ * hwnd, unsigned int msg, unsigned __int64 wParam, __int64 lParam) Line 177	C++
 	[External Code]	
 	ScreenCaptureforHWND.exe!WinMain(HINSTANCE__ * instance, HINSTANCE__ * previousInstance, char * cmdLine, int cmdShow) Line 156	C++
 	[External Code]	

Not quite the same as what we are seeing but the same problem and same reproduction steps.

How to reproduce:

This is a tricky one to reproduce in both our app and in the ScreenCaptureforHWND sample so I suspect there is a timing issue at play.

To reproduce the problem:

  1. Build the ScreenCaptureforHWND sample.
  2. Focus the window selection combo box and press up and down on the keyboard. The rate seems to matter here, you need to change sources quickly but not too quickly or the sample will crash for another unrelated reason. Can take a few minutes of source switching to happen on my end.
  3. Notice that the GUI is no longer responding to events as the main thread is hung. Sometimes an indicator that the problem is about to occur is the main thread starts to get bogged down and the GUI feels sluggish just before a full on deadlock is reached.

System info:

Edition	Windows 10 Pro
Version	22H2
Installed on	‎13/‎02/‎2021
OS build	19045.4170
Experience	Windows Feature Experience Pack 1000.19054.1000.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions