protonscr

Dark and Darker: launch deadlock

protonclosed appid 2016590
ValveSoftware/Proton#9967 · opened 2026-07-12 by dautry · updated 2026-07-12 · 1 comments · github · game page · search this game
Ddautry 2026-07-12 github

Compatibility Report

  • Name of the game with compatibility issues: Dark and Darker
  • Steam AppID of the game: 2016590

System Information

  • GPU: AMD Radeon RX 9070 XT (Navi 48, gfx1201)
  • Video driver version: Mesa 26.1.4 (RADV)
  • Kernel version: 7.1.3-ogc3.4.fc44.x86_64
  • Link to full system information report as Gist: sysinfo.txt
  • Proton version: 9.0-4, Experimental, Hotfix (reproduces on all three)

I confirm:

  • [x] that I haven't found an existing compatibility report for this game.
  • [x] that I have checked whether there are updates for my system available.

Symptoms

Hang on launch. Steam shows "Running", the window is a black screen that never
progresses, process must be killed.

Changing the Proton compatibility version typically produces one successful
launch, after which subsequent launches hang again. Across 8 logged launches, no
two successful launches ever occurred consecutively — every success was
immediately followed by a hang.

The game deadlocks while spawning the Sentry crash reporter subprocess
crashpad_handler.exe. eu-stack on the hung process:

__lll_lock_wait_private
__add_to_environ
putenv
NtCreateUserProcess

This is a putenv() call between fork() and exec() in a multithreaded
process. In dlls/ntdll/unix/process.c, spawn_process() double-forks and then
calls putenv() in the grandchild before exec_wineloader():

if (!(pid = fork()))  /* child */
{
    if (!(pid = fork()))  /* grandchild */
    {
        ...
        if (winedebug) putenv( winedebug );
        ...
        exec_wineloader( argv, socketfd, pe_info );

putenv() is not async-signal-safe. fork() clones only the calling thread, so
if any other thread in the game held glibc's environ lock at the moment of the
fork, the grandchild inherits it locked with no owner alive to release it.
__add_to_environ then blocks on that lock forever and the grandchild never
reaches exec_wineloader().

crashpad_handler.exe therefore never starts, and Sentry's crashpad client blocks
waiting for the handler to come up — which is where the game log stops.

Whether another thread is inside getenv/setenv at the moment of the fork
depends on startup thread interleaving, so this is a race — but not a uniform one.
Startup timing appears to be state-dependent, which matches the observed pattern:
changing the compatibility version forces prefix/cache work on the next launch and
yields one success, and once that state is warm the fork lands in the bad window
consistently.

Reproduction

  1. Launch the game. It hangs on most launches. Switching the compatibility version
    generally allows one launch to succeed; the launches after that hang again.

  2. On a hung launch, the game log stops at:

    LogSentrySdk: Verbose: using minidump URL ...
    

    A good launch continues to started crashpad client handler, then D3D12 init.

Every hang stopped at using minidump URL; every success passed
started crashpad client handler.

Workaround

Renaming the crashpad binary so the subprocess is never spawned stops the hang on
all three Proton versions. No hang since applying it.

mv "steamapps/common/Dark and Darker/DungeonCrawler/Plugins/sentry-unreal/Binaries/Win64/crashpad_handler.exe"{,.disabled}

Ruled out

  • Proton version — reproduces on 9.0-4, Experimental, Hotfix
  • GPU driver — no amdgpu resets in journalctl -k
  • DNS/network — Sentry minidump URL resolves
  • Shader cache — clearing it changes nothing

sysinfo.txt

good-launch-excerpt.log
game-log-HUNG-2026.07.11-19.40.log

Summarized by Claude.Ai

Kkisak-valve maintainer 2026-07-12 github

Hello @dautry, we're using one issue report per unofficially supported game title, so I've gone ahead and transferred this issue report to https://github.com/ValveSoftware/Proton/issues/8382#issuecomment-4952371826.

Upstream links