Друкувати журнал функцій / стек трасування для всієї програми за допомогою firebug


94

Firebug має можливість реєструвати виклики до певного імені функції. Я шукаю помилку, яка іноді зупиняє відображення сторінки, але не викликає помилок або попереджень. Помилка з’являється лише приблизно вдвічі. Отже, як мені отримати список усіх викликів функції для всієї програми, або якийсь трас стека для виконання всієї програми?

Відповіді:


218

Firefox надає console.trace() дуже зручний варіант для друку стека дзвінків. Він також доступний у Chrome та IE 11 .

Або спробуйте щось подібне:

function print_call_stack() {
  var stack = new Error().stack;
  console.log("PRINTING CALL STACK");
  console.log( stack );
}

2
Чи є спосіб збільшити довжину стека? Це було б дуже корисно.
Раві Тея,

✚1 console.warn ('[WARN] CALL STACK:', нова помилка (). Стек);
user1742529

13

Коли мені потрібен трас стека, я роблю наступне, можливо, ви можете черпати з цього натхнення:

function logStackTrace(levels) {
    var callstack = [];
    var isCallstackPopulated = false;
    try {
        i.dont.exist += 0; //doesn't exist- that's the point
    } catch (e) {
        if (e.stack) { //Firefox / chrome
            var lines = e.stack.split('\n');
            for (var i = 0, len = lines.length; i < len; i++) {
                    callstack.push(lines[i]);
            }
            //Remove call to logStackTrace()
            callstack.shift();
            isCallstackPopulated = true;
        }
        else if (window.opera && e.message) { //Opera
            var lines = e.message.split('\n');
            for (var i = 0, len = lines.length; i < len; i++) {
                if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
                    var entry = lines[i];
                    //Append next line also since it has the file info
                    if (lines[i + 1]) {
                        entry += " at " + lines[i + 1];
                        i++;
                    }
                    callstack.push(entry);
                }
            }
            //Remove call to logStackTrace()
            callstack.shift();
            isCallstackPopulated = true;
        }
    }
    if (!isCallstackPopulated) { //IE and Safari
        var currentFunction = arguments.callee.caller;
        while (currentFunction) {
            var fn = currentFunction.toString();
            var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf("(")) || "anonymous";
            callstack.push(fname);
            currentFunction = currentFunction.caller;
        }
    }
    if (levels) {
        console.log(callstack.slice(0, levels).join('\n'));
    }
    else {
        console.log(callstack.join('\n'));
    }
};

Примітка модератора : Здається, код у цій відповіді також з’являється в цій публікації з блогу Еріка Вендерліна . Автор цієї відповіді стверджує, що це власний код, однак написаний до повідомлення в блозі, на яке посилається тут. Для добросовісності я додав посилання на пост та цю примітку.


2
Існує виклик console.trace (), який ви можете зробити у Firebug, який це робить.
amccormack

Це геніально. Firebug має проблеми зі зменшеними файлами, цей сценарій це робить!
pstadler

1
FWIW @ andrew-barber, автор відповіді ніколи не стверджував як свою власну. Просто не приписував. Ваше редагування має бути коментарем.
Ascherer

7

Я зробив це без firebug. Перевірено як у chrome, так і у firefox:

console.error("I'm debugging this code.");

Після того, як ваша програма надрукує це на консолі, ви можете натиснути на маленьку стрілку до неї, щоб розширити стек дзвінків.


2

Спробуйте перейти по коду за один рядок або одну функцію за раз, щоб визначити, де він перестає працювати правильно. Або зробіть кілька розумних здогадок і розкидайте виписки з журналу через свій код.


2
Це. Безумовно, додайте вантаж console.log('something')операторів у свої функції, щоб побачити, які з них викликаються (а не)
Гарет,

1
Програма величезна, тому я шукаю спосіб порівняти журнали функцій, коли програма працювала правильно, а коли ні.
amccormack

1
Я згоден з тим, що це було б корисно. Я вступаю у власність на велику базу коду, і щось, що може генерувати запущений слід усіх викликів функцій, безумовно, допоможе зрозуміти потоки / форму коду та виявити мертвий код.
Метью Ніколс

1

Спробуйте це:

console.trace()

Я не знаю, чи підтримується він у всіх браузерах, тому спочатку перевірив би, чи існує.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.