В стековых трассах Node.js нет пользовательского кода

При отладке кода Node.js я часто сталкиваюсь со стеками вызовов, которые не включают в себя код моей программы, а только код node_modules / не пользователя, несмотря на то, что текущая строка выполнения находится в моем коде. Это лишает смысла следовать за стеком вызовов, чтобы увидеть путь выполнения через код моего приложения.

Почему мои исходные файлы не отображаются в стеке вызовов?

Полная трассировка стека

1 ответ

Решение

Похоже, что вы смотрите на трассировку асинхронного стека, где ваш код не находится в стеке, за исключением вашего обратного вызова, потому что ваш код размотан / завершен, а затем был вызван асинхронный обратный вызов.

Все .then() обработчики для всех обещаний вызываются асинхронно с чистым стеком. Это согласно спецификации обещания. Таким образом, обещания всегда позволяют текущему потоку выполнения завершиться и развернуться, а затем они запускаются .then() обработчики без пользовательского кода в стеке при вызове обратного вызова. То, что вы описываете, это то, как будет работать синхронный код, а не асинхронный код. Мы могли бы говорить более конкретно, а не теоретически, если бы вы показали реальный код и описали, где вы смотрите на стек вызовов.

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

В качестве более простого примера:

function foo() {
   setTimeout(() => {
       console.log("timer");    // set breakpoint here
   }, 100);
}

foo();

Функция foo() завершил выполнение и вернулся до вызова обратного вызова, и поэтому в трассировке стека не будет никакого кода (кроме только обратного вызова).

В то время как .then() обработчики используют немного другой планировщик, чем setTimeout()Принцип тот же.

Другие вопросы по тегам