Подтвердить что ты не робот

Как программно определить режим отладки в 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. Это лучший/правильный способ?

4b9b3361

Ответ 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');