Как беспрепятственно выполнять многоцелевую отладку Electron с помощью VSCode, используя устаревший протокол Electron 1.6.7, узел v6.11.1, vscode 1.17 и firefox?

471
Frank

Недавно я прочитал статью «Многоцелевая отладка Electron с помощью VSCode», URL-адрес которой https://kwonoj.github.io/en/post/multi-target-dbg-electron-vscode/, и убедился, что она бесперебойно работает в Oracle VM VirtuaBox. Менеджер, содержащий операционную систему RedHat Linux 7.1 с электронным 1.8.2, узлом v8.9.4, vscode 1.17 и firefox с использованием протокола инспектора. Вот мой launch.json, который устанавливает точки останова внутри main.js и main.cpp, аддона C ++, который вычисляет, является ли целое число простым числом.

{ "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type":"cppdbg", "program": "/home/hellodev/Downloads/node-v6.11.1-linux-x64/bin/node" "args": [ "--inspect-brk=5858", "main.js" ], "request": "launch", "stopAtEntry": false, "cwd": "$", "environment": [], "externalConsole": true, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "serverLaunchTimeout": 50000 }, { "type": "node", "request": "attach", "timeout": 10000, "name": "Attach Program", "port": 5858, "protocol": "inspector" }, { "type":"node", "request":"launch", "name":"Electron Main", "runtimeExecutable":"/home/hellodev/node-cpp-addons/node_modules/electron/dist/electron" "protocol":"inspector" }  ], "compounds": [ { "name": "Server/Client", "configurations": ["Electron Main","(gdb) Launch","Attach Program"] } ] } 

Как я мог бы расширить эту статью в том же Oracle VM VirtuaBox Manager, содержащем операционную систему RedHat Linux 7.1, чтобы использовать устаревший протокол, Electron 1.6.7, узел v6.11.1, vscode 1.17 и Firefox, и что будет выглядеть в пересмотренном файле launch.json лайк?

Безуспешно я попытался выполнить предварительную задачу электронов, чьи tasks.json показан ниже. Причина, по которой я попытался выполнить предварительную задачу, заключается в том, что runtimeExecutable зарезервирован для протокола инспектора, а не для устаревшего протокола. Однако предварительная задача вызывает ошибку времени выполнения EADDRESSINUSE: порт 5858.

{ "version": "1.6.7", "command": "electron", "isShellCommand": true, "args": [  "--remote-debugging-port=5858",  "$/main.js", ] } 

и получил сообщение об ошибке «Не удается подключиться к процессу выполнения: причина: сокет завершен другой стороной», когда я использовал следующий файл launch.json с зеленой стрелкой vscode для запуска конфигурации составного запуска.

"configurations": [ { "name": "(gdb) Launch", "type":"cppdbg", "program": "/home/hellodev/Downloads/node-v6.11.1-linux-x64/bin/node" "args": [ "--inspect-brk=5858", "main.js" ], "request": "launch", "stopAtEntry": false, "cwd": "$", "environment": [], "externalConsole": true, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "serverLaunchTimeout": 50000 }, { "type": "node", "request": "attach", "timeout": 10000, "name": "Attach Program", "port": 5858, "protocol": "legacy" }, { "type":"node", "request":"launch", "name":"Electron Main", "preLaunchTask": "electron", "protocol":"legacy", //Specify to use v8 inspector protocol "port": 5858, "timeout": 28000 }   ], "compounds": [ { "name": "Server/Client", "configurations": ["Electron Main","(gdb) Launch","Attach Program"] } ]  } 

[24 февраля 2018 года] @Andre Weinand, я показываю здесь мой новейший файл launch.json, который вызывает сообщение об ошибке «Не удается подключиться к среде выполнения; убедитесь, что среда выполнения находится в« устаревшем »режиме отладки». для отображения. Я пытался следовать всем вашим предыдущим рекомендациям, но все еще сталкиваюсь с проблемами. Поэтому, когда я нажимаю зеленую стрелку vscode, соответствующую конфигурации запуска составного соединения сервер / клиент, он запускает «Electron Main», но не достигает точек останова GDB, которые я установил в main.cpp, который является аддоном C ++. Я понимаю, что вы говорите о размещении операторов отладчика в исходном коде дополнения C ++, но я бы предпочел этого не делать. Как я могу исправить свой launch.json?

{ "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type":"cppdbg", "program": "/home/xyzdev/Downloads/node-v6.11.1-linux-x64/bin/node" "args": [ "--debug=5858" "main.js" ], "request": "launch", "stopAtEntry": true, "cwd": "$", "environment": [], "externalConsole": true, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "launchCompleteCommand": "None"  }, { "type": "node", "request": "attach", "timeout": 10000, "name": "Attach Program", "port": 5858, "protocol": "legacy" }, { "type":"node", "request":"launch", "name":"Electron Main", "runtimeExecutable":"/home/xyzdev/node-cpp-addons/node_modules/electron/dist/electron", "runtimeArgs": [ "$/main.js", "--remote-debugging-port" //Set debugging port for renderer process ], "protocol":"legacy" }   ], "compounds": [ { "name": "Server/Client", "configurations": ["Electron Main","(gdb) Launch","Attach Program"] } ]  } 

[26 февраля 2018 года] @ Андрей Вейнанд, я читал, что вы написали 10 мая 2017 года в статье на github.com https://github.com/Microsoft/vscode/issues/26411, в которой говорится: «Вы можете использовать любой« устаревший » или протокол «инспектора» для версии узла> 6.3 и <8.0, но вы должны убедиться, что используете соответствующий аргумент «--debug» или «--inspect».

Кстати, эта избыточность в конфигурации запуска будет исправлена ​​в майской версии: вам больше не нужно будет указывать порт, просто протокол будет работать правильно. "Поскольку я использую версию узла 6.11.1, которая > 6.3 и <8.0, мне было интересно, смогу ли я переключить наш launch.json на протокол «инспектора» вместо «устаревшего» протокола для достижения «бесшовной» отладки, как я смог сделать с узлом 8.9.4? Спасибо

0

1 ответ на вопрос

2
Andre Weinand

Атрибут «протокол» определяет, используется ли протокол «инспектор» или «устаревший». Пожалуйста, прочтите наш документ: https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_supported-nodelike-runtimes .

Вы не можете запустить два сеанса отладки с одним и тем же портом отладки параллельно (что вы делали в последней конфигурации отладки сверху). И отсутствует «программа» или «runtimeExecutable» отсутствует.

Я предлагаю изменить значение атрибута «protocol» в самой верхней конфигурации отладки на «legacy» (при условии, что протокол является единственной проблемой этой конфигурации).

Я ценю ваш подробный ответ. Мне интересно, нужно ли мне присваивать устаревшее значение протокола самой верхней (gdb) конфигурации отладки Launch. Кроме того, я смог использовать один и тот же порт отладки (т.е. 5858) параллельно при работе с протоколом инспектора, а не с устаревшим протоколом. Могу ли я спросить, какие порты мне следует выбрать, чтобы избежать ошибки EADDRESSINUSE? Спасибо. Frank 6 лет назад 0
В спешке задать исходный вопрос я, возможно, пропустил тот факт, что я использовал составную конфигурацию запуска, в которой Electron Main и (gdb) Launch and Attach Program имеют место последовательно, а не параллельно. Спасибо, что поймали мою ошибку с заданием preLaunch, которое происходит параллельно, Frank 6 лет назад 0
Я только что принял твой хороший ответ. Нужно ли явно включать браузер Firefox для devtools.chrome.enabled, используя about: config, чтобы vscode мог использовать устаревший протокол отладки Chrome v8? Спасибо, Frank 6 лет назад 0
Ваша конфигурация "cppdbg" не включает отладку node.js. Таким образом, использование атрибута «protocol» не имеет никакого смысла (и не поддерживается, как вы можете выяснить, используя его: вы увидите ошибку, волнистую). Однако конфигурация "cppdbg" запускает node.js, и, поскольку вы передаете "--inspect-brk = 5858", вы настроили его для отладки в режиме "инспектора". Если вы хотите использовать другой сеанс отладки с этим узлом, вы должны использовать соответствующие протоколы. Поэтому для «устаревшего» протокола не запускайте первый узел с «--inspect ...», а используйте аргумент «--debug». Andre Weinand 6 лет назад 0
Вы можете использовать любой свободный порт отладки. Для вашей первой конфигурации "cppdbg" я предлагаю вам явно указать порт (что вы уже делаете), потому что он должен соответствовать порту в другой конфигурации запуска (я полагаю, "Присоединить программу"). В вашем последнем конфиге запуска "Electron Main" я предлагаю не указывать порт. В этом случае VS Code автоматически выбирает свободный порт. Andre Weinand 6 лет назад 0
Перед попыткой составной конфигурации запуска убедитесь, что отдельные конфигурации запуска работают, запуская их один за другим вручную. Andre Weinand 6 лет назад 0
Я не могу ничего сказать о FireFox, потому что я не использую его. Andre Weinand 6 лет назад 0
@ Андрей Вейнанд, сегодня утром я узнал, что ты почти на 99% прав. Знаете ли вы, что после подключения с помощью vscode Electron 1.6.8 игнорирует точки останова? Что мне с этим делать? Большое спасибо. Frank 6 лет назад 0
@Andre Weinand, я прошу прощения за то, что я неправильно написал runtimeExecutable. Что мне нужно сделать, чтобы исправить следующую ошибку: Ошибка: Модуль './build/Debug/addon.node' был скомпилирован с другой версией Node.js с использованием NODE_MODULE_VERSION 48. Это версия Node.js требует NODE_MODULE_VERSION 53. Пожалуйста, попробуйте перекомпилировать или переустановить модуль в process.module. (анонимная функция) [as dlopen] (ELECTRON_ASAR.js: 173: 20) в Object.Module._extensions .. узел (module.js: 598: 18) в Object.module. (анонимная функция) [как .node] (ELECTRON_ASAR.js: 173: 20) Спасибо. Frank 6 лет назад 0
@Andre Weinand, я забыл упомянуть, что я только что выполнил rebuild node-gyp --debug, чтобы исправить ошибку: Ошибка: модуль './build/Debug/addon.node' был скомпилирован с другим Node.js версия с использованием NODE_MODULE_VERSION 48. Спасибо. Frank 6 лет назад 0
@ Андре Вайнанд, я заметил, что мой package.json содержит запись для электрона ^ 1,6,8 и электронное перестроение ^ 1,7,3. Может ли это быть причиной ошибки, Ошибка: Модуль './build/Debug/addon.node' был скомпилирован с другой версией Node.js с использованием NODE_MODULE_VERSION 48. Эта версия Node.js требует NODE_MODULE_VERSION 53, которую я наблюдал вчера ? Спасибо. Frank 6 лет назад 0
Если Electron 1.6.8 игнорирует точки останова, то обычно вы пытаетесь отладить неправильный процесс. Попробуйте использовать оператор «отладчик» вместо точки останова. Если вы до сих пор не попали, моя гипотеза верна. Andre Weinand 6 лет назад 0
При использовании собственных узловых модулей с электронным блоком вам придется строить их для узла, который содержится в версии Electron, а не для версии внешнего узла, которая имеет ту же версию. Andre Weinand 6 лет назад 0
@ Андре Вайнанд, я добавил новый раздел внизу моего первоначального вопроса об обмене стеками SuperUser. Могу ли я спросить, не могли бы вы взглянуть на это и сказать, что мне нужно изменить в файле launch.json, чтобы моя конфигурация составного запуска «Сервер / Клиент» могла беспрепятственно воздействовать на все точки останова main.js и main.cpp, которые я без проблем установил с помощью наследства протокол? Спасибо. Frank 6 лет назад 0
@ Андре Вейнанд, Как мне перестроить аддон C ++ addon.node, чтобы я мог исправить ошибку: «Ошибка: модуль ./build/Debug/addon.node» был скомпилирован с другой версией Node.js с использованием NODE_MODULE_VERSION 48. Эта версия Node.js требует NODE_MODULE_VERSION 53. " Мой package.json содержит запись для электрона ^ 1,6,8 и электронное перестроение ^ 1,7,3. Моя версия узла - это узел 6.11.1. Спасибо. Frank 6 лет назад 0
@ Андре Вейнанд, я читал, что вы написали 10 мая 2017 года в статье github.com https://github.com/Microsoft/vscode/issues/26411, в которой говорится: «Вы можете использовать протокол« прежних версий »или« инспектор » для версии узла> 6.3 и <8.0, но вы должны убедиться, что используете соответствующий аргумент «--debug» или «--inspect». Так как я использую версию узла 6.11.1, которая> 6.3 и <8.0 Мне было интересно, смогу ли я переключить наш launch.json на протокол «инспектора» вместо «устаревшего» протокола, чтобы добиться «бесшовной» отладки, как я смог сделать с узлом 8.9.4? Спасибо Frank 6 лет назад 0
В Electron есть встроенный node.js, который поддерживает устаревшую версию или инспектор, но не то и другое одновременно. Электрон перешел с наследства на инспектора в версии 1.7.4 (я думаю). Так что вы должны знать, что вы можете использовать в вашем случае. Andre Weinand 6 лет назад 0
@ Андре Вайнанд, я использую Electron 1.6.8 и Node 6.11.1 в моем файле launch.json. Когда я переключаюсь на протокол инспектора с унаследованного протокола, я использую runtimeArg [--inspect = 5858], но консоль отладки показывает --inspect = 19763, а ошибка подключения отказывается на порте 19763. Как я мог исправить эту ошибку, которую я наблюдал вчера ? Спасибо. Frank 6 лет назад 0
Вы прочитали и поняли мой предыдущий пост? Если вы используете Electron 1.6.8 (старше 1.7.4), поддерживается только «устаревший» протокол. Поэтому нет смысла пытаться использовать протокол «инспектора». Andre Weinand 6 лет назад 0
@ Андре Weinand, JavaScript имеет оператор отладчика, в то время как C ++ не имеет оператора отладчика. Следовательно, должен ли я заключить, что нам нужно подождать, пока электрон 1.8.2 и узел 8.9.4 будут выпущены в наш репозиторий программного обеспечения с открытым исходным кодом git, который находится за корпоративным прокси-сервером HTTP, чтобы предложить пользователям беспроблемную отладку с использованием протокола инспектора? Спасибо. Frank 6 лет назад 0
Я не понимаю твоего вопроса. Какова связь между оператором отладчика и электронной версией и версией узла? Andre Weinand 6 лет назад 0
@ Андре Вейнанд, я помню, вы 21 февраля заявили, что «если Electron 1.6.8 игнорирует точки останова, то обычно вы пытаетесь отладить неправильный процесс. Попробуйте использовать оператор« отладчик »вместо точки останова». Но после обширного поиска в Google я обнаружил, что нет никаких отладочных операторов c ++, которые эмулировали бы стратегически размещенные точки останова gdb. В результате я пришел к выводу, что в Electron 1.6.8 нет средства, позволяющего игнорировать точки останова при использовании с «устаревшим» протоколом. Могу я установить nvm Electron 1.7.4 совместно с узлом 6.11.1 и запустить их обоих в качестве инспектора? Frank 6 лет назад 0
Я предполагал, что вы хотите отлаживать JavaScript-части приложения Electron, потому что почти никто никогда не будет отлаживать C ++-части Electron. По этой причине я упомянул использование оператора «отладчик». Если вам нужно отладить C ++, я не могу вам помочь (и нет оператора отладчика). Проблема протокола "унаследованный" и "инспектор" относится только к node.js. Это не имеет ничего общего с C ++. Если у вас есть проблемы с точками останова C ++, я не могу вам помочь (потому что я написал только отладчик узла VS Code). Andre Weinand 6 лет назад 0
При использовании Electron вы не можете выбрать версию node.js, поскольку Electron использует только встроенный в него узел js. Таким образом, выбирая конкретную версию Electron, вы также выбираете версию node.js. Это определяет, должна ли отладка узла использовать протокол «прежних версий» или «инспектор». Но это полностью независимо от отладки C ++. Отладчик C ++ VS Code - это отдельное расширение, которое требуется только при разработке собственных узловых модулей (например). Andre Weinand 6 лет назад 0
@ Андрей Вейнанд, Мы не хотим отлаживать части C ++ или внутренние компоненты Electron. Скорее, мы хотим отладить дополнительный модуль C ++, который вычисляет, является ли целое число простым числом. Есть ли у нас возможность сделать это? Большое спасибо. Frank 6 лет назад 0
Как этот дополнительный модуль интегрирован в Electron? Через узел модуля? Andre Weinand 6 лет назад 0
@ Андре Вейнанд, я считаю, что наш дополнительный модуль C ++ интегрирован с Electron через модуль узлов. Все детали нашего открытого концептуального доказательства концепции описаны в этой статье: https: //medium.com/@marcinbaraniecki/extending-node-js-with-native-c-modules-63294a91ce4. Могу я попросить вас осмотреть это? Спасибо за вашу помощь. Frank 6 лет назад 0
Я предлагаю вам сосредоточиться на отладке C ++ вашего нативного кода. Нет необходимости отлаживать любой JavaScript в вашем случае, поэтому обсуждение протокола «устаревший» или «инспектор» является спорным. Andre Weinand 6 лет назад 0
@ Андре Вейнанд, я последовал вашему предложению просто сосредоточиться на отладке C ++ нашего нативного кода с использованием gdb с vscode, и это сработало. Однако теперь я хотел бы сделать точку останова приложения узла (то есть main.js) в vscode до и / или после отладки потока GDB. Если это возможно, как мы можем сделать это с электроном 1.6.8 и узлом 6.11.1? Спасибо за помощь. Frank 6 лет назад 0
@ Андре Вейнанд, я получил сообщение об ошибке «Не удается подключиться к процессу выполнения. Сокет завершен другой стороной», когда я переключился с электрона на 1.6.8 на электрон на 1.6.7. Затем, когда я использовал fuser 5858 / tcp, он обнаружил, что процесс vscode прослушивал порт 5858, процесс electon 1.6.7 прослушивал порт 5858 и что было установлено соединение tcp из процесса vscode с электронным 1.6.7. когда я запустил «Электронную Главную» часть моей конфигурации запуска соединения. Есть ли способ исправить эту ошибку, чтобы я мог плавно переключаться с "Electron Main" на запуск GDB? Спасибо. Frank 6 лет назад 0
У вас не может быть двух или более процессов, прослушивающих один и тот же порт! Так что не используйте флаг «--debug» по умолчанию в этом случае, потому что он начнет прослушивать порт 5858. Вместо этого используйте что-то вроде «--debug = 6666». Но убедитесь, что вы используете тот же порт в конфигурации запуска, поэтому укажите `" порт ": 6666`. Кроме того, начинайте пробовать только составные запуски, если отдельные части работают. Andre Weinand 6 лет назад 0