Repository navigation
[Linux][26.924] SIGCHLD handler overwritten during startup; preserving libuv handler restores thread loading #48618
Description
Environment
- ChatGPT Desktop:
26.924.22138-1 - Build:
11645, commit2e782921399a788a842b74ee1944a2e1e6e003a1 - Bundled app-server:
0.158.0-alpha.2.1 - OS: CachyOS, x86_64
- Kernel:
7.2.8-1-cachyos - Desktop: KDE Wayland; application running through XWayland
Related reports: #48419, #48413, #48397. This report adds process-level tracing and a controlled diagnostic intervention. A shared root cause across those reports has not been independently verified.
Symptoms
After updating to 26.924.x, existing local conversations remain loading. Reinstalling 26.924.22138-1 does not resolve it.
The local app-server initializes successfully and answers thread/read, but conversation loading does not complete.
Additional symptoms:
Failed to load shell env ... Timed out after 5000ms.
Git is unavailable
The desktop process retains terminated zsh, git, ps, and gh children as zombies. Inspected zsh and git children exited successfully with status 0.
Startup tracing
Tracing rt_sigaction, wait4, waitid, and SIGCHLD showed this sequence in the desktop main process:
12:49:56.548989 SIGCHLD handler registered: libuv handler, SA_RESTART
12:49:56.611927 SIGCHLD handler replaced: no-op handler, flags=0
12:50:00.037904 SIGCHLD delivered: child exited with status 0
Disassembly of the replacement handler showed that it returns without doing work.
The registration pattern matches the no-op handler installed by ChromeBrowserMainPartsPosix::PreEarlyInitialization. The precise caller identification is inferred from the disassembly and upstream source; full application debug symbols were unavailable.
Controlled comparison
A baseline run under GDB reproduced the failure.
In a second run, GDB intercepted only the identified no-op SIGCHLD registration and changed its act argument to NULL, preserving the previously installed handler. Installed application files were not modified.
Both runs used the same application version, user profile, configuration, and existing conversation.
| Check | Baseline | No-op replacement suppressed |
|---|---|---|
| Shell environment initialization | 5000 ms timeout | No timeout recorded |
| Terminated child processes | Remain zombies | No zombies observed |
| Git operations | Reported unavailable | Commands complete |
| Existing conversation | Loading never completes | Content visible in 1512 ms |
Successful-run log excerpts, with identifiers omitted:
method=thread/resume durationMs=467 errorCode=null
maybe_resume_success
name=thread_navigation outcome=success
marksMs={"hydration_started":444.3,"history_ready":1246.8,
"hydration_finished":1287.4,"content_visible":1512}
Additional checks
- Reproduced with Qt excluded and GTK used instead.
- Both local SQLite databases passed read-only
PRAGMA quick_check. - Running Git through login zsh succeeds in approximately 0.6 seconds.
- Running Git through the separately bundled Node runtime succeeds in approximately 6 ms.
- Existing conversation data loaded successfully without resetting the profile.
Expected behavior / suggested investigation
Desktop initialization should preserve libuv's child-exit handling.
Please investigate initialization ordering between Chromium's placeholder SIGCHLD registration and libuv. Preserving the existing handler, or ensuring libuv registers after Chromium initialization, appears to address the observed failure.
The debugger intervention was diagnostic only, not a proposed production patch. It used a build-specific handler identification; no permanent workaround was installed.
Activity
github-actions commentedon Sep 27, 2026
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
smturtle2 commentedon Sep 27, 2026
This report appears to share the underlying defect described in #48554, but adds an independent controlled test on CachyOS.
A baseline run under GDB reproduced the failure. A second run changed only the
actargument of the identified no-opsigaction(SIGCHLD, ...)registration toNULL, preserving libuv's handler. No preload library or on-disk application patch was used.With the same application version, profile, configuration, and existing conversation, this single intervention eliminated the observed zombie children and restored loading:
thread/resumecompleted in 467 ms and content became visible in 1512 ms.This provides additional causal evidence for the handler-overwrite mechanism, independently of the preload workaround. This is supporting evidence for the same defect, not a claim of a separate bug.
jazeem-azeez commentedon Sep 27, 2026
yuzhu-oai commentedon Sep 28, 2026
The issue has been fixed. Please update to the latest version.