Во время отладки JavaScript, есть ли способ предупредить текущий стек вызовов? - PullRequest
23 голосов
/ 14 января 2010

Для простой отладки JavaScript я буду использовать оповещения, чтобы показать значения переменных и тому подобное. Есть ли способ получить текущий стек вызовов в javascript, чтобы иметь возможность отображать его в предупреждении?

Спасибо.

Ответы [ 7 ]

40 голосов
/ 14 января 2010

Быстро и грязно в браузерах на базе Gecko:

new Error().stack

Вы также можете вручную тралить часть стека, используя Function.prototype.caller:

var thisFunction = arguments.callee;
var caller = thisFunction.caller;
var callerCaller = caller.caller;
// ...and eventually, assuming no recursion:
var bottomCaller = ...;
assert(bottomCaller.caller === null);

Одно (возможно, большое) предостережение от трюка .caller заключается в том, что он не обрабатывает рекурсию - .caller смотрит сверху вниз на стек, чтобы найти первый экземпляр функции в стеке, а затем возвращает ее непосредственный абонент, поэтому, не проявляя осторожности, вы можете зацикливаться на бесконечном поиске абонентов.

Еще одна оговорка к caller заключается в том, что в дальнейшем, если какой-либо ваш код использует строгий режим ECMAScript 5, свойство caller функций строгого режима (или функций, которые сами были вызваны из функций строгого режима) так называемая «таблетка с ядом», которая выбрасывает TypeError при доступе. Свойство caller «связанных» функций (созданных методом ES5 Function.prototype.bind) также является ядом. Эти ограничения нарушают общий алгоритм обхода стеков, хотя можно представить способы обхода этого, зависящие от использования (возможно, функции аннотирования входа и выхода).

Обратите внимание, что подобная обработка стека не является хорошей идеей в производственном коде (как быстрый взлом для отладки, это хорошо, правда); на данный момент обход стека, как в последнем примере, несколько дорог в движке Mozilla JS, и он, вероятно, выбросит вас из машинного кода и вернет в интерпретируемый код. Кроме того, обход стека O (n 2 ), что может иметь значение, если вы склонны иметь сложные глубокие стеки.

24 голосов
/ 14 января 2010

В Firefox + Firebug и WebKit вы можете использовать console.trace()

Он не отображает alert(), но печатает stacktrace на консоли.

6 голосов
/ 14 января 2010

Используйте отладчик как Firebug для этого, если вы находитесь в Firefox. Chrome и Opera имеют встроенный отладчик. И есть Инструменты разработчика для Internet Explorer.

3 голосов
/ 14 января 2010

Вы смотрели на firebug - и точку останова.Если это только для отладки, то этого может быть достаточно.

Также - вы можете посмотреть Здесь

3 голосов
/ 14 января 2010

Лучший способ отладки Javascript - использовать Firebug , который включает в себя полный отладчик Javascript.

Если вы отлаживаете в IE, вы можете использовать Visual Web Developer Express (или любой другой выпуск Visual Studio).
Если вы отлаживаете IE8, вы можете использовать его встроенные средства разработчика, которые включают отладчик.

Возможно получить стек вызовов в Javascript; см здесь .

1 голос
/ 04 сентября 2014

Это даст вам весь стек вызовов работает хорошо для меня.

var y = 'arguments.callee.caller';
    while (eval(y) != undefined) {
        stak += eval(y + '.toString()');
        y = y + '.caller';
    }
    alert(stak);
0 голосов
/ 26 июля 2017

Для отладки nodejs в коде Visual Studio, начиная с v.1.14.2, это View-> Debug (Ctrl + Shift + D)

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