Aller au contenu principal

Débogage sur macOS

Si vous êtes confrontés à des plantages ou des problèmes dans Electron et que vous pensez qu'il ne viennent pas de votre app JavaScript, mais plutôt d'Electron lui-même, alors le débogage peut être un peu difficile, surtout pour les développeurs peu expérimentés dans le débogage natif/C++. Toutefois, en utilisant lldb, et le code source d'Electron, vous pouvez activer le débogage avec des points d’arrêt dans le code source d'Electron. Vous pouvez également, si vous préférez une interface graphique, utiliser XCode pour le débogage.

Spécifications requises

  • Compilation test d’Electron : le moyen le plus simple est généralement de compiler à partir des sources, ce que vous pouvez faire en suivant les instructions de la compilation. Bien que vous puissiez vous attacher et déboguer Electron puisque vous pouvez le télécharger directement, vous allez trouver qu'il est fortement optimisé, ce qui rend le débogage beaucoup plus difficile. Dans ce cas, le débogueur ne sera pas en mesure de vous montrer le contenu de toutes les variables et le chemin d'exécution peut sembler étrange à cause de l'inlining, appels de queue, et autres optimisations de compilation.

  • Xcode: En plus de Xcode, vous devez aussi installer les outils de ligne de commande de Xcode. Ils incluent LLDB, le débogueurXoce par défaut sous macOS. Il prend en charge le débogage en C, Objectif-C et Cm sur les appareils et simulateurs de bureau et d’iOS.

  • .lldbinit : Créez ou éditez ~/.lldbinit pour permettre au code Chromium d'être correctement source-mappé.

    # e.g: ['~/electron/src/tools/lldb']
    script sys.path[:0] = ['<...path/to/electron/src/tools/lldb>']
    script import lldbinit

Débogage d'Electron

Pour démarrer une session de débogage, ouvrez le Terminal et démarrez lldb, en passant une version non-version d'Electron en paramètre.

$ lldb ./out/Testing/Electron.app
(lldb) target create "./out/Testing/Electron.app"
Current executable set to './out/Testing/Electron.app' (x86_64).

Définition de points d’arrêt

LLDB est un outil puissant et supporte plusieurs stratégies d'inspection de code. Pour cette introduction basique, assumons que vous exécutez une commande JavaScript qui ne se comporte pas correctement - donc vous aimeriez voir l'equivalent de cette commande en C++.

Les fichiers de code pertinents peuvent être trouvés dans ./shell/.

Supposons que vous souhaitez déboguer app.setName(), qui est définie dans browser.cc comme Browser::SetName(). Définissez le point d’arrêt à l’aide de la commande de breakpoint, en spécifiant le fichier et la ligne à couper :

(lldb) breakpoint set --file browser.cc --line 117
Breakpoint 1: where = Electron Framework`atom::Browser::SetName(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) + 20 at browser.cc:118, address = 0x000000000015fdb4

Ensuite, démarrez Electron :

(lldb) run

L’app sera immédiatement suspendu, puisque l’électron définit le nom de l’application au lancement :

(lldb) run
Process 25244 launched: '/Users/fr/Code/electron/out/Testing/Electron. pp/Contents/MacOS/Electron' (x86_64)
Le processus 25244 s'est arrêté
* thread #1: tid = 0x839a4c, 0x0000000100162db4 Electron Framework`atom::Browser::SetName(this=0x0000000108b14f20, name="Electron") + 20 au navigateur. c:118, queue = 'com.apple.main-thread', stop reason = point d'arrêt 1.
frame #0: 0x0000000100162db4 Electron Framework`atom::Browser::SetName(this=0x0000000108b14f20, name="Electron") + 20 dans le navigateur. c:118
115 }
116
117 void Browser::SetName(const std::string& name) {
-> 118 name_override_ = name;
119 }
120
121 int Browser::GetBadgeCount() {
(lldb)

Pour afficher les arguments et les variables locales pour le frame en cours, exécutez frame variable (ou fr v), qui vous montrera que l'app est en train de mettre le nom à "Electron".

(lldb) frame variable
(atom::Browser *) this = 0x0000000108b14f20
(const string &) name = "Electron": {
[...]
}

Pour faire une étape au niveau source dans le thread actuellement sélectionné, exécutez step (ou s). Cela vous amènerait dans name_override_.empty(). Pour continuer et refaire une étape, exécutez next (ou n).

(lldb) step
Process 25244 stopped
* thread #1: tid = 0x839a4c, 0x0000000100162dcc Electron Framework`atom::Browser::SetName(this=0x0000000108b14f20, name="Electron") + 44 at browser.cc:119, queue = 'com.apple.main-thread', stop reason = step in
frame #0: 0x0000000100162dcc Electron Framework`atom::Browser::SetName(this=0x0000000108b14f20, name="Electron") + 44 at browser.cc:119
116
117 void Browser::SetName(const std::string& name) {
118 name_override_ = name;
-> 119 }
120
121 int Browser::GetBadgeCount() {
122 return badge_count_;

REMARQUE : Si vous ne voyez pas le code source alors que vous pensez que vous devriez, vous n'avez peut-être pas ajouté le fichier ~/.lldbinit ci-dessus.

Pour terminer de déboguer à ce stade, exécutez : process continue. Vous pouvez également continuer jusqu'à ce qu'une certaine ligne soit atteinte dans ce thread (thread until 100). Cette commande exécutera le thread dans la frame active jusqu'à ce qu’il atteigne la ligne 100 dans cette frame ou s’arrête si il quitte lcelle-ci.

Maintenant, si vous ouvrez les outils de développement d'Electron et appelez setName, vous atteindrez une fois de plus le point d’arrêt.

Lectures additionnelles

LLDB est un outil puissant, avec une excellente documentation. Pour en savoir plus à ce sujet, examinez la documentation de débogage d'Apple, plus particulièrement la Référence de la structure des commandes LLDB ou l'introduction à l'utilisation de LLDB comme débogueur autonome.

Vous pouvez également consulter les fantastiques manuel et tutoriel pour LLDB, qui vous expliquera des scénarios de débogage plus complexes.