Firebug kullanarak tüm program için işlev günlüğünü / yığın izini yazdırın


94

Firebug, belirli bir işlev adına yapılan çağrıları günlüğe kaydetme yeteneğine sahiptir. Bazen bir sayfanın oluşturulmasını durduran, ancak herhangi bir hataya veya uyarıya neden olmayan bir hata arıyorum. Böcek yalnızca yaklaşık yarısı ortaya çıkar. Öyleyse, tüm program için tüm işlev çağrılarının bir listesini veya tüm programın yürütülmesi için bir tür yığın izini nasıl elde edebilirim?

Yanıtlar:


218

Firefox console.trace() , çağrı yığınını yazdırmak için çok kullanışlı olanı sağlar . Ayrıca Chrome ve IE 11'de de mevcuttur .

Alternatif olarak şuna benzer bir şey deneyin:

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

3
Yığının uzunluğunu artırmanın bir yolu var mı? Çok yardımı dokunur.
Ravi Teja

✚1 console.warn ('[WARN] CALL STACK:', new Error (). Stack);
user1742529

13

Yığın izine ihtiyacım olduğunda aşağıdakileri yapıyorum, belki ondan biraz ilham alabilirsiniz:

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

Moderatörün notu : Bu yanıttaki kod, Eric Wenderlin'in blogundaki bu gönderide de görünüyor . Bu cevabın yazarı, burada bağlantısı verilen blog gönderisinden önce yazılmış kendi kodu olduğunu iddia ediyor. Sadece iyi niyet amacıyla, gönderiye ve bu nota bağlantı ekledim.


2
Firebug'da bunu yapan bir console.trace () çağrısı vardır.
amccormack

Bu harika. Firebug'ın küçültülmüş dosyalarla ilgili sorunları var, bu komut dosyası bunu yapıyor!
pstadler

1
FWIW @ andrew-barber, cevabın yazarı asla kendi olduğunu iddia etmedi. Sadece atıfta bulunmadım. Düzenlemeniz bir yorum olmalıdır.
Ascherer

7

Bunu kundaksız başardım. Hem chrome hem de firefox'ta test edilmiştir:

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

Programınız bunu konsola yazdırdığında, çağrı yığınını genişletmek için küçük oka tıklayabilirsiniz.


2

Doğru çalışmayı nerede durdurduğunu belirlemek için kodunuzda her seferinde bir satır veya bir işlev adım adım ilerlemeyi deneyin. Veya bazı makul tahminlerde bulunun ve kodunuz aracılığıyla günlük kaydı ifadelerini dağıtın.


2
Bu. console.log('something')Hangilerinin çağrıldığını (ve hangilerinin çağrılmadığını) görmek için kesinlikle işlevlerinize bir sürü ifade ekleyin
Gareth

1
Program çok büyük, bu yüzden programın doğru çalıştığı ve çalışmadığı zaman için işlev günlüklerini karşılaştırmanın bir yolunu arıyorum.
amccormack

1
Bunun yararlı olacağına katılıyorum. Büyük bir kod tabanının sahipliğini üstlenmek için adım atıyorum ve tüm işlev çağrılarının çalışan bir izini oluşturabilecek bir şey, kodun akışını / şeklini anlamaya ve ölü kodu tespit etmeye kesinlikle yardımcı olacaktır.
Matthew Nichols

1

Bunu dene:

console.trace()

Tüm tarayıcılarda desteklenip desteklenmediğini bilmiyorum, bu yüzden önce var olup olmadığını kontrol ederim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.