Skip to content

Commit 78b3675

Browse files
committed
docs: initial investigation report for UI crash
1 parent ad0e33e commit 78b3675

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

myia/01-ui-crash-investigation.md

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Rapport d'Investigation : Crash de l'UI de Roo Code
2+
3+
**Date :** 2025-08-02
4+
**Auteur :** Roo, Assistant Technique
5+
**Protocole :** SDDD (Semantic Documentation Driven Design)
6+
7+
---
8+
9+
## 1. Contexte
10+
11+
Ce document analyse les causes potentielles du crash récurrent de l'interface utilisateur (WebView) de l'extension Roo Code. Le symptôme principal est un écran gris qui ne répond plus, survenant fréquemment lors de l'utilisation de plusieurs fenêtres VSCode ou après de longues sessions d'utilisation.
12+
13+
L'investigation s'est concentrée sur le fichier `roo-code/src/core/webview/ClineProvider.ts`, identifié comme le composant central de la gestion de la WebView via une recherche sémantique initiale.
14+
15+
---
16+
17+
## 2. Analyse et Hypothèses
18+
19+
L'examen du code de `ClineProvider.ts` a permis de formuler plusieurs hypothèses sur l'origine du problème.
20+
21+
### Fichier Clé Analysé
22+
23+
* **Chemin :** `roo-code/src/core/webview/ClineProvider.ts`
24+
* **Rôle :** Gère l'intégralité du cycle de vie de la WebView, de sa création à sa destruction, y compris la gestion des états et la communication avec l'extension.
25+
26+
### Hypothèse 1 : Libération incorrecte des ressources (`Disposables`)
27+
28+
**Observation :**
29+
La classe `ClineProvider` utilise deux collections pour les ressources à libérer : `disposables` (global) et `webviewDisposables` (spécifique à la vue). La logique dans `onDidDispose` (lignes 487-501) ne nettoie que `webviewDisposables` pour la vue de la barre latérale.
30+
31+
**Cause potentielle :**
32+
Une ressource liée à la vue (ex: listener) ajoutée par erreur au tableau global `disposables` ne sera pas libérée à la fermeture de la barre latérale, créant une **fuite de mémoire** et des listeners "fantômes" pouvant provoquer un crash.
33+
34+
### Hypothèse 2 : Conditions de concurrence ("Race Conditions")
35+
36+
**Observation :**
37+
La méthode `postStateToWebview` est appelée depuis de nombreux endroits, souvent de manière asynchrone, sans vérifier si la vue `this.view` est toujours valide avant d'appeler `postMessage`.
38+
39+
**Cause potentielle :**
40+
Un événement peut déclencher un `postStateToWebview` juste au moment où l'UI est fermée. L'appel à `postMessage` sur une référence invalide est une cause classique de crashs.
41+
42+
### Hypothèse 3 : Complexité de la gestion multi-fenêtres
43+
44+
**Observation :**
45+
La classe utilise un ensemble statique `activeInstances` pour suivre les vues dans différentes fenêtres.
46+
47+
**Cause potentielle :**
48+
Une mauvaise synchronisation lors de la destruction d'une vue pourrait laisser des instances "zombies" dans `activeInstances`, conduisant à des interactions avec des objets détruits.
49+
50+
---
51+
52+
## 3. Conclusion et Recommandations Initiales
53+
54+
Les causes les plus probables du crash sont des **fuites de ressources** et des **conditions de concurrence**, exacerbées par la complexité du multi-fenêtres.
55+
56+
---
57+
58+
## 4. Correctifs Implémentés
59+
60+
En réponse aux hypothèses formulées, les actions suivantes ont été menées pour stabiliser le `ClineProvider`.
61+
62+
### Renforcement de `postMessageToWebview`
63+
64+
* **Problème :** Des appels à `postMessage` sur une `webview` potentiellement invalide ou non visible pouvaient causer des crashs (Race Condition).
65+
* **Solution :** Une garde de protection a été ajoutée à la méthode `postMessageToWebview`. Avant tout appel, elle vérifie désormais si `this.view` est défini et si `this.view.visible` est `true`. De plus, un bloc `try...catch` intercepte les erreurs spécifiques à une `webview` "disposed", évitant ainsi un crash complet.
66+
67+
Cette modification prévient les erreurs fatales lorsqu'un message est envoyé à une `webview` en cours de fermeture ou déjà détruite, renforçant significativement la robustesse du composant face aux conditions de concurrence.

0 commit comments

Comments
 (0)