Saltar al contenido principal

Depuración en macOS

If you experience crashes or issues in Electron that you believe are not caused by your JavaScript application, but instead by Electron itself, debugging can be a little bit tricky especially for developers not used to native/C++ debugging. However, using lldb and the Electron source code, you can enable step-through debugging with breakpoints inside Electron's source code. You can also use XCode for debugging if you prefer a graphical interface.

Requisitos

  • 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. While you can attach to and debug Electron as you can download it directly, you will find that it is heavily optimized, making debugging substantially more difficult. In this case the debugger will not be able to show you the content of all variables and the execution path can seem strange because of inlining, tail calls, and other compiler optimizations.

  • Xcode: In addition to Xcode, you should also install the Xcode command line tools. They include LLDB, the default debugger in Xcode on macOS. Admite depuración de C, Objective-C y C++ en el escritorio y los dispositivos y simuladores iOS.

  • .lldbinit: Crear o editar ~/.lldbinit para permitir que el código de Chromium sea correctamente mapeado de fuentes.

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

A y depuración Electron

Para empezar una sesión de depuración, abra el terminal e inicie lldb, pasando al constructo de depuración de Electron como un parámetro.

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

Establecer puntos de interrupción

LLDB es una herramienta poderosa y soporta múltiples estrategias para la inspección de código. Para esta instrucción básica, asumamos que está llamando un comando para JavaScript que no se está comportando correctamente - así que a usted le gustaría separarlo en la contraparte de esos comandos en C++ dentro de la fuente Electron.

Relevant code files can be found in ./shell/.

Asumamos que quiere depurar app.setName(), el cual está definido en browser.cc como Browser::SetName(). Configure un punto de separación usando el comando breakpoint, especificando el archivo y la linea que quiere separar:

(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

Luego, inicie Electron:

(lldb) run

La aplicación será pausada inmediatamente, mientras Electron configura el nombre de esta en el lanzador:

(lldb) run
Process 25244 launched: '/Users/fr/Code/electron/out/Testing/Electron.app/Contents/MacOS/Electron' (x86_64)
Process 25244 stopped
* thread #1: tid = 0x839a4c, 0x0000000100162db4 Electron Framework`atom::Browser::SetName(this=0x0000000108b14f20, name="Electron") + 20 at browser.cc:118, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x0000000100162db4 Electron Framework`atom::Browser::SetName(this=0x0000000108b14f20, name="Electron") + 20 at browser.cc:118
115 }
116
117 void Browser::SetName(const std::string& name) {
-> 118 name_override_ = name;
119 }
120
121 int Browser::GetBadgeCount() {
(lldb)

Para mostrar los argumentos y las variables locales para la estructura actual, corra variable de estructura (o fr v), que le mostrará que la aplicación está siendo configurada con el nombre de "Electron".

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

Para hacer un solo paso en el nivel de la fuente en el hilo seleccionado, ejecute paso (o s). Esto lo llevará dentro de name_override_.empty(). Para proceder y dar otro paso, corra siguiente (o 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_;

NOTA: Si no ves el código fuente cuando crees que deberías, es posible que no hayas añadido el archivo ~/.lldbinit anterior.

Para finalizar la depuración en este punto, corra continuar proceso. También puede continuar hasta cierta linea es tocada en este hilo (hilo hasta 100). Este comando correrá el hilo en la estructura actual hasta que alcance la linea 100 en este, o se detiene si deja la estructura en la que se encuentra.

Ahora, si abre las herramientas para desarrolladores y llama setName, alcanzará de nuevo el punto de interrupción.

Leer más

LLDB es una herramienta poderosa con una gran documentación. Para aprender más sobre esto, considera leer la documentación sobre la depuración de Apple, como LLDB Command Structure Reference o la introducción de Using LLDB as a Standalone Debugger.

You can also check out LLDB's fantastic manual and tutorial, which will explain more complex debugging scenarios.