Skip to content

Absturz beim Start einer zweiten Fassung neben der laufenden behoben - #19

Merged
oe5sos merged 1 commit into
mainfrom
fix/socket-absturz-readyread
Sep 30, 2026
Merged

oe5sos merged 1 commit into
mainfrom
fix/socket-absturz-readyread

Conversation

@oe5sos

@oe5sos oe5sos commented Sep 30, 2026

Copy link
Copy Markdown
Owner

Absturzbericht Contestprogramm-2026-09-28-110149.ips: 0.1.1, lief seit 08:57, um 11:01:33 EXC_BAD_ACCESS bei 0x30 im Hauptthread (doActivate ← QIODevice::channelReadyRead ← canReadNotification ← QReadNotifier). Zwei Minuten vorher lag /Applications/Contestprogramm-neu.app zum Testen bereit und wurde neben der laufenden Fassung gestartet.

Ursache

Die neue Fassung meldet sich beim SingleInstanceGuard der laufenden mit anderem Baustempel → newerBuildStarted im readyRead des QLocalSocket → main.cpp startet neu und ruft release() → release() löschte den QLocalServer sofort, und mit ihm den Client-Socket (sein Kind), während der noch in seinem eigenen readyRead steckte. Qt sendet gleich danach channelReadyRead() auf demselben Socket, in freigegebenen (von macOS genullten) Speicher: d_ptr = 0, Lesezugriff auf 0x30.

Die vier TCP-Clients (ON4KST, Cluster, rigctld, rotctld) scheiden aus: Sie sind Wert-Member von AppController, ihre Sockets werden nur geschlossen, nie gelöscht.

Fix

release() schließt den Server wie bisher (lauscht nicht mehr, Name und Sperre frei), löscht ihn aber per deleteLater(). Die Annahmeschleife hält den Server als Zeiger statt über das dabei geleerte m_server.

Nachweis

  • Neuer Test releasingFromTheRestartSignalDoesNotPullTheSocketFromUnderItsOwnRead: ohne Fix auf jeder Plattform rot. Unter ASan mit free_fill_byte=0 stürzt der Code ohne Fix an genau den Offsets aus dem Bericht ab (QtCore+0xf2f80, Zugriff 0x30).
  • Live mit Sandbox-Datenordner: installierte Fassung läuft, zweite daneben gestartet → Status 139, neuer Absturzbericht mit denselben fünf Qt-Offsets. Mit Fix 3/3 sauberer Neustart (Status 0), kein Bericht.
  • ctest: 107/107.

🤖 Generated with Claude Code

Absturzbericht Contestprogramm-2026-09-28-110149.ips: 0.1.1 lief seit
08:57, um 11:01:33 EXC_BAD_ACCESS bei 0x30 im Hauptthread, in
doActivate <- QIODevice::channelReadyRead <- canReadNotification <-
QReadNotifier. Zwei Minuten vorher lag /Applications/Contestprogramm-
neu.app zum Testen bereit, und Martin startete sie neben der laufenden.

Der Weg: die neue Fassung meldet sich beim SingleInstanceGuard der
laufenden mit einem anderen Baustempel. Der liest die Zeile im
readyRead des QLocalSocket, sendet newerBuildStarted, main.cpp startet
neu und ruft dafür release() auf. release() löschte den QLocalServer
sofort, und mit ihm den Client-Socket (dessen Kind), während der noch
in seinem eigenen readyRead steckte. Qt sendet direkt danach
channelReadyRead() auf demselben Socket: in freigegebenen Speicher.
macOS nullt den, d_ptr ist 0, Lesezugriff auf 0x30.

Die vier TCP-Clients (ON4KST, Cluster, rigctld, rotctld) scheiden aus:
sie leben als Wert-Member von AppController so lange wie das Programm,
ihre Sockets werden nur geschlossen, nie gelöscht.

Der Fix: release() schließt den Server wie bisher (lauscht nicht mehr,
Name frei, Sperre frei), löscht das Objekt aber per deleteLater(),
also erst, wenn der Stapel abgebaut ist. Die Annahmeschleife hält den
Server als Zeiger statt über m_server, das release() mittendrin leert.

Nachgestellt, vorher und nachher:
- Test releasingFromTheRestartSignalDoesNotPullTheSocketFromUnderItsOwnRead:
  ohne Fix rot auf jeder Plattform (Socket überlebt release() nicht);
  unter ASan mit free_fill_byte=0 Absturz an genau den Offsets des
  Berichts (QtCore+0xf2f80, Zugriff 0x30).
- Live mit Sandbox-Datenordner: installierte Fassung laufen lassen,
  zweite Fassung daneben starten -> Status 139, neuer Absturzbericht
  mit denselben fünf Qt-Offsets wie Martins. Mit Fix 3/3 sauberer
  Neustart, Status 0, kein Bericht.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@oe5sos
oe5sos merged commit 59d4134 into main Sep 30, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant