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. You can also use XCode for debugging if you prefer a graphical interface.

SpĂ©cifications requises​

  • A testing build of Electron: The easiest way is usually to build it from source, which you can do by following the instructions in the build instructions. 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.