Wydrukuj dziennik funkcji / ślad stosu dla całego programu za pomocą firebuga

94

Firebug ma możliwość rejestrowania wywołań do określonej nazwy funkcji. Szukam błędu, który czasami zatrzymuje renderowanie strony, ale nie powoduje żadnych błędów ani ostrzeżeń. Błąd pojawia się tylko w połowie przypadków. Jak więc uzyskać listę wszystkich wywołań funkcji dla całego programu lub jakiś ślad stosu do wykonania całego programu?

amccormack
źródło

Odpowiedzi:

218

Firefox zapewnia console.trace() bardzo przydatne narzędzie do drukowania stosu wywołań. Jest również dostępny w przeglądarce Chrome i IE 11 .

Alternatywnie spróbuj czegoś takiego:

function print_call_stack() {
  var stack = new Error().stack;
  console.log("PRINTING CALL STACK");
  console.log( stack );
}
Matt Schwartz
źródło
3
Czy istnieje sposób na zwiększenie długości stosu? To byłoby bardzo pomocne.
Ravi Teja
✚1 console.warn ('[WARN] CALL STACK:', new Error (). Stack);
user1742529
13

Kiedy potrzebuję śladu stosu, wykonuję następujące czynności, może możesz czerpać z niego inspirację:

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'));
    }
};

Uwaga moderatora : kod w tej odpowiedzi wydaje się pojawiać również w tym poście z bloga Erica Wenderlina . Jednak autor tej odpowiedzi twierdzi, że jest to jego własny kod, napisany przed zamieszczonym tutaj postem na blogu. Tylko w dobrej wierze dodałem link do posta i tej notatki.

Martin Jespersen
źródło
2
Istnieje wywołanie console.trace (), które możesz wykonać w Firebug, które to robi.
amccormack,
To jest genialne. Firebug ma problemy ze zminimalizowanymi plikami, ten skrypt to robi!
pstadler
1
FWIW @ andrew-barber, autor odpowiedzi nigdy nie twierdził, że jest jego własnym. Po prostu nie przypisałem. Twoja zmiana powinna być komentarzem.
Ascherer
7

Udało mi się to bez firebuga. Przetestowane w Chrome i Firefox:

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

Gdy program wydrukuje to na konsoli, możesz kliknąć małą strzałkę, aby rozszerzyć stos wywołań.

satnam
źródło
2

Spróbuj przejść przez kod po jednym wierszu lub jednej funkcji na raz, aby określić, gdzie przestaje działać poprawnie. Możesz też zgadnąć i rozproszyć instrukcje logowania w kodzie.

Casablanka
źródło
2
To. Zdecydowanie dodaj ładunek console.log('something')instrukcji do swoich funkcji, aby zobaczyć, które z nich są (a nie) są wywoływane
Gareth,
1
Program jest ogromny, więc szukam sposobu na porównanie dzienników funkcji, kiedy program działał poprawnie, a kiedy nie.
amccormack
1
Zgadzam się, że byłoby to przydatne. Wkraczam, aby przejąć dużą bazę kodu i coś, co może wygenerować bieżący ślad wszystkich wywołań funkcji, z pewnością pomogłoby w zrozumieniu przepływu / kształtu kodu i wykryciu martwego kodu.
Matthew Nichols,
1

Spróbuj tego:

console.trace()

Nie wiem, czy jest obsługiwany we wszystkich przeglądarkach, więc najpierw sprawdzę, czy istnieje.

Abraham Albero
źródło