Skip to content

Windows: intermittent RPC connection resets (WinError 10054) while replay daemon remains alive #278

Open

Description

@doc-haz

Update / correction after further testing:

My original report was too strong in saying that the replay daemon terminates.

Further testing shows that the observed WinError 10054 is usually an intermittent RPC/connection reset while the daemon itself remains alive.

After several failures, rdc --session <name> status still succeeds and subsequent replay queries can continue without reopening the capture.

Examples observed:

  • passes
  • usage
  • pipeline <EID> viewport
  • descriptors <EID>
  • bindings <EID>
  • even one status call

In multiple cases, the failed command returned WinError 10054, but the daemon continued serving later commands.

So the more accurate issue is:

"Windows: intermittent RPC connection resets (WinError 10054) while replay daemon remains alive"

The failure is intermittent and does not appear limited to frame-wide queries.

Activity

  1. changed the title [-]Windows: replay daemon can terminate during `usage` / `passes` with WinError 10054[/-] [+]Windows: intermittent RPC connection resets (WinError 10054) while replay daemon remains alive[/+] on Oct 9, 2026
  2. BANANASJIM commented on Oct 10, 2026

    @BANANASJIM
    Owner

    Could you share the exact command sequence or a small script that triggers the reset, along with your rdc-cli commit/version and RenderDoc version? Please also include the full error output, how often it happens, and whether commands are run sequentially or concurrently.

  3. doc-haz commented on Oct 11, 2026

    @doc-haz
    Author

    Thanks — I was able to recover a much smaller historical reproducer.

    Environment:

    • rdc-cli: 0.6.3
    • RenderDoc: 1.46
    • Commands were run sequentially, not concurrently.

    The smallest case I found contains only a single PickPixel call:

    ```python
    controller.SetFrameEvent(9622, True)
    
    res_id = None
    for t in controller.GetTextures():
        if int(t.resourceId) == 1553:
            res_id = t.resourceId
            break
    
    sub = rd.Subresource()
    sub.mip = 0
    sub.slice = 0
    sub.sample = 0
    
    pix = controller.PickPixel(
        res_id,
        616,
        609,
        sub,
        rd.CompType.Typeless,
    )
    
    print("PixelValue props:", [
        p for p in dir(pix)
        if not p.startswith("_")
    ])
    
    print(
        "pix.floatValue:",
        [round(x, 4) for x in pix.floatValue],
    )
    

    The sequence was:

    1. Start/connect to an rdc-cli replay session.
    2. Run the script above against an already-open capture.
    3. In this recovered case, the request failed with:
      daemon unreachable: [WinError 10054] An existing connection was forcibly closed by the remote host
    4. Subsequent requests to the same session also returned WinError 10054 in that recovered sequence.

    There was one harmless error immediately before this test while I was correcting the script:
    TypeError: in method 'new_ResourceId', argument 1 of type 'ResourceId const &'
    After fixing that ResourceId handling, the first recovered run containing the actual PickPixel call was immediately followed by the connection reset.

    An important correction to my earlier observations: I initially suspected that the problem correlated mainly with hundreds of PickPixel calls. That is not required. I have now recovered a case where a script containing only one PickPixel call is followed immediately by WinError 10054.
    The failure is intermittent, though, so I do not yet have a 100% deterministic reproducer.

    I also recovered a separate case where a normal descriptor query produced the same WinError 10054, but the replay session itself remained alive afterward and successfully served later binding/shader queries. Because of that, at least some occurrences appear to be an RPC connection reset rather than a full replay-daemon process termination.

    I am preparing a fresh controlled run where I will:

    • launch the daemon with stdout/stderr redirected to files,
    • connect a clean session,
    • execute the one-PickPixel reproducer once,
    • capture both client output and daemon logs.
      If it reproduces again, I will attach those logs here. If it does not, I will report that as well since it would further confirm the intermittent nature of the issue.
  4. BANANASJIM commented on Oct 20, 2026

    @BANANASJIM
    Owner

    Hi @doc-haz, have you had a chance to run the controlled repro? I've opened draft #279 with persistent RPC diagnostics.

    If you're able to test that branch, set RDC_DAEMON_LOG before opening a fresh session, run the one-PickPixel script once, then check status. Please share the client output and the log plus its .stderr companion; the setup instructions include a PowerShell example. A run where it doesn't reproduce would also be useful.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions