Как отлаживать бинарный модуль nodejs?

У меня есть модуль node.js, написанный на C ++, который предоставляет некоторые привязки для библиотеки C ++. Библиотека падает с SIGSEGV, поэтому мне нужно отладить ее с помощью GDB и выяснить, что не так.

У меня уже есть источник для модуля в ./node_modules/somelib/ и если я пойду в эту папку и введите npm install библиотека скомпилирована и может использоваться через require (‘somelib’) из node.js. Я могу прикрепить GDB к узлу и воспроизвести ошибку, но в трассировке стека я просто вижу node_modules/somelib/Release/somelib.node,

Я не уверен, если это важно, но библиотека скомпилирована с использованием node-gyp,

  • Вопрос 1: Как загрузить исходный код или указать GDB на исходный код?
  • Вопрос 2: Как мне настроить node-gyp производить отладочные символы?

19

Решение

Я только что нашел ответ на этот вопрос в node-gyp документация. Решение состоит в том, чтобы вызвать процесс сборки с --debug флаг. Это значит, чтобы вызвать node-gyp configure --debug и / или node-gyp build --debug, Тогда вместо Release папка а Debug папка будет создана. Затем GDB автоматически загрузит исходные файлы.

16

Другие решения

Бесстыдно скопировано с архив (неработающей) ссылки, предоставленной @Peter Cordes

Сначала скомпилируйте ваше дополнение, используя node-gyp с флагом —debug.

$ node-gyp --debug configure rebuild

Во-вторых, если вы все еще находитесь в режиме «площадка», как я, вы, вероятно, загружаете свой модуль с чем-то вроде

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

Однако, когда вы перестраиваете с помощью node-gyp в режиме отладки, node-gyp выбрасывает версию Release и вместо этого создает версию Debug. Итак, обновите путь к модулю:

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

Хорошо, теперь мы готовы к отладке нашего дополнения C ++. Запустите gdb для двоичного узла, который является приложением C ++. Теперь сам узел не знает о вашей надстройке, поэтому, когда вы пытаетесь установить точку останова для вашей надстройки (в данном случае, StringReverse), он жалуется, что конкретная функция не определена. Не бойтесь, ваша надстройка является частью «будущей загрузки совместно используемой библиотеки», к которой она относится, и будет загружена, как только вам потребуется () ваша надстройка в 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

Хорошо, теперь мы просто должны запустить приложение:

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

Вы можете добавить каталог, содержащий источник модуля, в путь поиска GDB:

(gdb) directory /path/to/source

Увидеть: http://sourceware.org/gdb/onlinedocs/gdb/Source-Path.html

Кроме того, чтобы получить node-gyp символы отладки, установить node-gyp-dbg/dev или эквивалентный, или скомпилируйте его с -g

0

Если вы являетесь пользователем VSCode, вы можете найти этот полезный порядок для отладки вашего модуля.

Основные шаги:

  1. Установите плагин vscode https://github.com/vadimcn/vscode-lldb

  2. Настройте файл launch.json таким образом:


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

Затем установите точки останова, как в коде VS.

Удачной отладки!

Я также опубликовал подробный блог здесь, если вы хотите более подробное объяснение.

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

0
По вопросам рекламы [email protected]