tutorial ryan node ejemplos dahl c++ node.js node-gyp

c++ - ryan - npm



¿Cómo depurar el módulo binario de nodejs? (4)

Acabo de encontrar la respuesta a esto en la documentación de node-gyp . La solución es invocar el proceso de compilación con el indicador --debug . Eso significa invocar node-gyp configure --debug y / o node-gyp build --debug . Luego, en lugar de una carpeta de Release , se creará una carpeta de Debug . gdb cargará automáticamente los archivos de origen.

Tengo un módulo node.js escrito en C ++ que proporciona algunos enlaces para una biblioteca de C ++. La biblioteca se bloquea con SIGSEGV, así que necesito depurarla con GDB y descubrir qué está mal.

Ya tengo la fuente del módulo en ./node_modules/somelib/ y si voy a esa carpeta y npm install la biblioteca está compilada y se puede usar a través de un require (''somelib'') de node.js. Puedo adjuntar gdb a node y reproducir el error, pero en el stacktrace solo veo node_modules/somelib/Release/somelib.node .

No estoy seguro de si esto es importante pero la biblioteca está compilada usando node-gyp .

  • Pregunta 1: ¿Cómo se carga el código fuente o apunto gdb al código fuente?
  • Pregunta 2: ¿Cómo configuro node-gyp para producir símbolos de depuración?

Puede agregar el directorio que contiene la fuente del módulo a la ruta de búsqueda de gdb:

(gdb) directory /path/to/source

Consulte: http://sourceware.org/gdb/onlinedocs/gdb/Source-Path.html

Además, para obtener los símbolos de depuración node-gyp , instale node-gyp-dbg/dev o equivalente, o compílelo con -g


Si es usuario de VSCode, puede encontrar esto útil para depurar su módulo.

Los pasos básicos son:

  1. Instale el complemento vscode https://github.com/vadimcn/vscode-lldb

  2. Configura tu launch.json para que se vea así:

{ "version": "0.2.0", "configurations": [{ "type": "lldb", "request": "launch", "name": "Launch Program", "program": "/absolute/path/to/node", "args": [ "/absolute/path/to/your/index.js" ] }] }

Luego, configure los puntos de interrupción como lo haría en VS Code.

Feliz depuración!

También he publicado un blog detallado aquí si desea una explicación más detallada.

https://medium.com/@atulanand94/debugging-nodejs-c-addons-using-vs-code-27e9940fc3ad


Copiado descaradamente de un archive del enlace (ahora roto) proporcionado por @Peter Cordes

Primero, compile su complemento usando node-gyp con la marca --debug.

$ node-gyp --debug configure rebuild

Segundo, si todavía estás en el modo "área de juegos" como yo, probablemente estés cargando tu módulo con algo como

var ObjModule = require(''./ObjModule/build/Release/objModule'');

Sin embargo, cuando reconstruye usando node-gyp en modo de depuración, node-gyp tira la versión Release y crea una versión de depuración. Así que actualiza la ruta del módulo:

var ObjModule = require(''./ObjModule/build/Debug/objModule'');

Bien, ahora estamos listos para depurar nuestro complemento de C ++. Ejecute gdb contra el nodo binario, que es una aplicación de C ++. Ahora, el nodo en sí mismo no conoce su complemento, por lo que cuando intenta establecer un punto de interrupción en su función de complemento (en este caso, StringReverse) se queja de que la función específica no está definida. No temas, tu complemento es parte de la "futura carga de biblioteca compartida" a la que hace referencia, y se cargará una vez que necesites () tu complemento en JavaScript.

$ gdb node ... Reading symbols from node...done. (gdb) break StringReverse Function "StringReverse" not defined. Make breakpoint pending on future shared library load? (y or [n]) y

OK, ahora solo tenemos que ejecutar la aplicación:

(gdb) run ../modTest.js ... Breakpoint 1, StringReverse (args=...) at ../objModule.cpp:49