Как программно определить режим отладки в nodejs?
Я видел этот вопрос, заданный на другой платформе/языках - любые идеи? Я хотел бы сделать что-то вроде:
if (detectDebug())
{
require('tty').setRawMode(true);
var stdin = process.openStdin();
stdin.on('keypress', function (chunk, key) {
DoWork();
}
}
else
{
DoWork();
}
Я хотел бы иметь возможность переключать ввод с клавиатуры в качестве начала для script при отладке, чтобы у меня было время, чтобы запустить chrome для прослушивания моего порта node -spectoror.
*** Быстрое обновление - я предполагаю, что могу фактически использовать "process.argv", чтобы определить, был ли передан -debug. Это лучший/правильный способ?
Ответы
Ответ 1
NodeJS создает глобальный объект v8debug
при работе в режиме отладки: node debug script.js
Таким образом, возможным решением могло бы быть:
var debug = typeof v8debug === 'object';
В моем случае использования я использую его, потому что хочу избежать передачи переменных окружения. Мой основной процесс node запускает дочерние процессы node, и я хочу, чтобы node debug mainScript.js
запускал режим отладки для детей (опять же, не передавая переменные env дочерним процессам)
Ответ 2
Я думаю, что в этом вопросе есть путаница.
Основываясь на вашем вопросе, я думаю, что вам действительно нужен флаг командной строки node --debug-brk
. У этого будет node запуск v8 с запуском отладчика и автоматическая остановка в точке останова перед первой строкой вашей программы .js
. Вам не нужно изобретать это. Я использую это для отладки тестов mocha, проблем с запуском express.js и т.д. Это избавит вас от необходимости обнаруживать это вручную.
Во-вторых, NODE_ENV=production
- не что иное, как соглашение, которое многие программы используют для обозначения "вы работаете в производстве", и поэтому необходимо включить определенные вещи, такие как отправка по электронной почте сообщений, использование реального шлюза платежей и т.д. Однако какая среда, в которой вы находитесь, когда NODE_ENV
НЕ является производством (или не установлена), обязательно НЕ следует считать отладкой. Самое разумное предположение заключается в том, что среда является средой разработки, но даже тогда вся эта конвенция довольно хрупкая, на мой взгляд.
В-третьих, просто FYI проверит tty.isatty(), который точно скажет вам, запущена ли ваша программа на интерактивном терминале (например, из командной оболочки). Это будет false
, когда ваша программа запускается диспетчером процессов, предоставляемым вашей ОС (выскочка, sysvinit и т.д.). Эта проверка обычно используется для переключения программ командной строки между интерактивными и сценарийными режимами. Это не совсем совершенное или непогрешимое, но оно широко принято в мире posix.
В-четвертых, из нескольких быстрых экспериментов, v8debug
global @Gabriel Petrovay указывает, что устанавливается только при выполнении node debug script.js
и не устанавливается при выполнении node --debug script.js
. Не уверен, почему это, Если бы такая вещь была надежной, это выглядело бы как самый правильный подход к обнаружению "это этот экземпляр v8 в режиме отладки".
Ответ 3
Объект global.v8debug, кажется, создается или отображается только в том случае, если задана опция командной строки debug или --debug-brk. Это странно и раздражает, когда он не создан, когда установлен параметр -debug.
Хакерным способом сделать это будет просмотр массива process.execArgv(не process.argv) для -debug, -debug-brk или debug.
Ответ 4
Я использую этот
var debug = typeof v8debug === 'object'
|| /--debug|--inspect/.test(process.execArgv.join(' '));
который поддерживает --debug
, --debug-brk
, --inspect
и --inspect=1234
Ответ 5
var detectDebug = function() {
return process.env.NODE_ENV !== 'production';
};
для запуска в режиме отладки:
$ node app.js
для запуска в режиме производства:
$ NODE_ENV=production node app.js
Некоторые структуры распознают режим производства таким образом. См. express.js doc.
Ответ 6
process.debugPort
всегда присутствует и по умолчанию используется значение 5858. Единственный способ определить, была ли программа запущена явно с помощью --debug
, - это проверить массив process.execArgv
. --debug-brk
довольно очевидно обнаружить: ваша программа ничего не сделает, и вы получите сообщение об прослушивании отладчика, чтобы это было тривиально, чтобы понять. v8debug
появляется, когда программа запускается с помощью node debug file.js
или когда в данный момент подключен отладчик, например node -инспектор.
Помня об этом, этот код определит, подключен ли отладчик (любого вида).
var debug, withDebug;
debug = false;
if (typeof v8debug !== "undefined" && v8debug !== null) {
console.log("v8 debug detected");
debug = true;
}
withDebug = process.execArgv.indexOf('--debug') > -1 || process.execArgv.indexOf('--debug-brk') > -1;
if (withDebug) {
console.log("started with debug flag, port: " + process.debugPort);
debug = true;
}
if ((typeof v8debug === "undefined" || v8debug === null) && !withDebug) {
console.log("neither detected");
}
Ответ 7
Object.defineProperty(global, 'isDebugging', {
get: function () {
return typeof v8debug !== 'undefined';
}
});
Это хорошо работает для webstorm
Ответ 8
В версиях nodejs >= 7 нет v8debug.
Похоже, что самый простой способ - проверить параметры командной строки. В режиме отладки появится слово "debug" или "проверка"
const argv = process.execArgv.join();
const isDebug = argv.includes('inspect') || argv.includes('debug');