У меня есть модуль node.js, написанный на C ++, который предоставляет некоторые привязки для библиотеки C ++. Библиотека падает с SIGSEGV, поэтому мне нужно отладить ее с помощью GDB и выяснить, что не так.
У меня уже есть источник для модуля в ./node_modules/somelib/
и если я пойду в эту папку и введите npm install
библиотека скомпилирована и может использоваться через require (‘somelib’) из node.js. Я могу прикрепить GDB к узлу и воспроизвести ошибку, но в трассировке стека я просто вижу node_modules/somelib/Release/somelib.node
,
Я не уверен, если это важно, но библиотека скомпилирована с использованием node-gyp
,
node-gyp
производить отладочные символы?Я только что нашел ответ на этот вопрос в node-gyp
документация. Решение состоит в том, чтобы вызвать процесс сборки с --debug
флаг. Это значит, чтобы вызвать node-gyp configure --debug
и / или node-gyp build --debug
, Тогда вместо Release
папка а Debug
папка будет создана. Затем GDB автоматически загрузит исходные файлы.
Бесстыдно скопировано с архив (неработающей) ссылки, предоставленной @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
Вы можете добавить каталог, содержащий источник модуля, в путь поиска GDB:
(gdb) directory /path/to/source
Увидеть: http://sourceware.org/gdb/onlinedocs/gdb/Source-Path.html
Кроме того, чтобы получить node-gyp
символы отладки, установить node-gyp-dbg/dev
или эквивалентный, или скомпилируйте его с -g
Если вы являетесь пользователем VSCode, вы можете найти этот полезный порядок для отладки вашего модуля.
Основные шаги:
Установите плагин vscode https://github.com/vadimcn/vscode-lldb
Настройте файл 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