[Diagnose][P0] Release-builds schrijven geen enkele fout weg — "start niet" en "loopt vast" zijn niet te onderzoeken #2618

Closed
opened 2026-10-28 16:31:27 +00:00 by brenno · 2 comments
Owner

Symptoom

Gebruikers melden dat OciDeck "regelmatig niet opstart" of "vastloopt terwijl ik werk" (o.a. op Windows 10). We kunnen dat nu niet onderzoeken: een release-build laat geen enkel spoor achter.

Oorzaak

lib/utils/log.dart stuurt alles naar dart:developer (developer.log). Die stroom bestaat alleen met een aangesloten VM-service (DevTools/flutter run). In een release-build verdwijnen dus álle ~800 logError/logWarning-aanroepen, inclusief de zone-handler in lib/main.dart:78 (Uncaught zone error) en FlutterError.onError. Er is geen logbestand, geen crashmarkering en geen manier voor een gebruiker om iets mee te sturen.

Daarbij: op Windows wordt het venster pas getoond bij het eerste frame (windows/runner/flutter_window.cpp:40, SetNextFrameCallback → Show()). Hangt iets vóór dat frame, dan ziet de gebruiker níets — wel een proces in Taakbeheer.

Voorgestelde oplossing

  1. Lokaal, begrensd logbestand in de applicatie-ondersteuningsmap: twee roterende bestanden van elk ≤1 MiB, append-only, async geschreven (gebufferd, flush op fout en bij afsluiten). Zelfde privacyregel als nu: alleen operatienaam + gesaneerde fout (_safeError), nooit deck- of bestandsinhoud, geen paden van gebruikersbestanden (of alleen de bestandsnaam-hash). Valt onder de bestaande belofte in docs/PRIVACY.md — tekst daar bijwerken.
  2. Opstartmijlpalen met tijdstempel: main gestart, elke await vóór runApp klaar (AssetStaging.initialize, lexicon, configureNativeWindow), eerste frame, toestemming geladen, shell gebouwd. Zo zie je in één logregel wáár een start bleef hangen.
  3. UI-stallmelder: een Timer.periodic(250 ms) die de drift meet; is de UI-isolate >500 ms bezet geweest, log dan de duur plus het laatst gezette "werklabel" (een goedkope currentOperation-string die zware paden zetten: gezichtsscan, export, openen, documentsync). Dit levert precies de data die "loopt vast" nu mist.
  4. Crashmarkering: een running-bestand dat bij nette afsluiting verdwijnt. Staat het er bij de volgende start nog, dan de vorige sessie als "onverwacht beëindigd" loggen.
  5. Help → Diagnose: knop "Logmap openen" en "Diagnose kopiëren" (versie, OS-versie, GPU/renderer indien bekend, laatste 200 regels). De gebruiker beslist zelf of hij iets deelt; niets gaat automatisch het netwerk op (geen telemetrie).

Wat overeind moet blijven

  • Geen netwerkverkeer, geen telemetrie. Release blijft "stil" naar buiten.
  • Geen persoonsgegevens in het log (bestaande regel in de kop van log.dart); een test die een FormatException met bron-inhoud logt en controleert dat de inhoud niet in het bestand belandt.

Toets

  • Unit: rotatie bij 1 MiB, nooit meer dan 2 bestanden; sanering van FormatException.
  • Integratie: start → mijlpalen staan in het log; een kunstmatige UI-blokkade van 800 ms levert één stallregel.
  • Release-rookproef op Windows (#2314) leest na de start het log en eist de mijlpaal "eerste frame" — dan bewijst de proef dat er een venster kwam, niet alleen dat het proces leeft.

Onderdeel van de prestatie- en stabiliteitsinspectie van 28-10-2026 (EPIC #2637).

## Symptoom Gebruikers melden dat OciDeck "regelmatig niet opstart" of "vastloopt terwijl ik werk" (o.a. op Windows 10). We kunnen dat nu niet onderzoeken: een release-build laat geen enkel spoor achter. ## Oorzaak `lib/utils/log.dart` stuurt alles naar `dart:developer` (`developer.log`). Die stroom bestaat alleen met een aangesloten VM-service (DevTools/`flutter run`). In een release-build verdwijnen dus álle ~800 `logError`/`logWarning`-aanroepen, inclusief de zone-handler in `lib/main.dart:78` (`Uncaught zone error`) en `FlutterError.onError`. Er is geen logbestand, geen crashmarkering en geen manier voor een gebruiker om iets mee te sturen. Daarbij: op Windows wordt het venster pas getoond bij het eerste frame (`windows/runner/flutter_window.cpp:40`, `SetNextFrameCallback → Show()`). Hangt iets vóór dat frame, dan ziet de gebruiker níets — wel een proces in Taakbeheer. ## Voorgestelde oplossing 1. **Lokaal, begrensd logbestand** in de applicatie-ondersteuningsmap: twee roterende bestanden van elk ≤1 MiB, append-only, async geschreven (gebufferd, flush op fout en bij afsluiten). Zelfde privacyregel als nu: alleen operatienaam + gesaneerde fout (`_safeError`), nooit deck- of bestandsinhoud, geen paden van gebruikersbestanden (of alleen de bestandsnaam-hash). Valt onder de bestaande belofte in `docs/PRIVACY.md` — tekst daar bijwerken. 2. **Opstartmijlpalen** met tijdstempel: `main` gestart, elke `await` vóór `runApp` klaar (`AssetStaging.initialize`, lexicon, `configureNativeWindow`), eerste frame, toestemming geladen, shell gebouwd. Zo zie je in één logregel wáár een start bleef hangen. 3. **UI-stallmelder**: een `Timer.periodic(250 ms)` die de drift meet; is de UI-isolate >500 ms bezet geweest, log dan de duur plus het laatst gezette "werklabel" (een goedkope `currentOperation`-string die zware paden zetten: gezichtsscan, export, openen, documentsync). Dit levert precies de data die "loopt vast" nu mist. 4. **Crashmarkering**: een `running`-bestand dat bij nette afsluiting verdwijnt. Staat het er bij de volgende start nog, dan de vorige sessie als "onverwacht beëindigd" loggen. 5. **Help → Diagnose**: knop "Logmap openen" en "Diagnose kopiëren" (versie, OS-versie, GPU/renderer indien bekend, laatste 200 regels). De gebruiker beslist zelf of hij iets deelt; niets gaat automatisch het netwerk op (geen telemetrie). ## Wat overeind moet blijven - Geen netwerkverkeer, geen telemetrie. Release blijft "stil" naar buiten. - Geen persoonsgegevens in het log (bestaande regel in de kop van `log.dart`); een test die een `FormatException` met bron-inhoud logt en controleert dat de inhoud niet in het bestand belandt. ## Toets - Unit: rotatie bij 1 MiB, nooit meer dan 2 bestanden; sanering van `FormatException`. - Integratie: start → mijlpalen staan in het log; een kunstmatige UI-blokkade van 800 ms levert één stallregel. - Release-rookproef op Windows (#2314) leest na de start het log en eist de mijlpaal "eerste frame" — dan bewijst de proef dat er een venster kwam, niet alleen dat het proces leeft. Onderdeel van de prestatie- en stabiliteitsinspectie van 28-10-2026 (EPIC #2637).
Author
Owner

Opgepakt op tak fix/release-logbestand-2618. Verwachte reikwijdte: lib/utils/log.dart (bestandssink), lib/main.dart (mijlpalen, crashmarkering), een stallmelder, Help → Diagnose, docs/PRIVACY*.md.

Opgepakt op tak `fix/release-logbestand-2618`. Verwachte reikwijdte: `lib/utils/log.dart` (bestandssink), `lib/main.dart` (mijlpalen, crashmarkering), een stallmelder, Help → Diagnose, `docs/PRIVACY*.md`.
Author
Owner

PR #2654 staat open (tak fix/release-logbestand-2618, make check groen op 697348e64). Nog niet gemerged: er loopt een release, en de Windows-kant (integratietest + strengere rookproef) heeft nog niet op Windows gedraaid.

PR #2654 staat open (tak `fix/release-logbestand-2618`, `make check` groen op `697348e64`). Nog niet gemerged: er loopt een release, en de Windows-kant (integratietest + strengere rookproef) heeft nog niet op Windows gedraaid.
brenno 2026-10-29 15:22:50 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#2618
No description provided.