8

Internet Explorer 8'de JavaScript'te bir istisna oluştuğunda tam çağrı yığını almam gerekiyor. Numaraları büyük olan kareler arasında işlev çağrıları oluşabilir.Birden çok çerçeve için tam aramalar IE8'de JS

Geliştiricilere günlükleri göndermek için gerekli çağrı yığını. Bir hata ayıklayıcısını kullanamıyorum çünkü son kullanıcının bu sorunla uğraşması gerekmiyor.

JavaScripts için geçerli çözüm, calltack (http://eriwen.com/javascript/js-stack-trace/) oluşturabilmesini sağladı. Arguments.callee.caller dayanmaktadır. Ancak, işlev geçerli çerçevenin dışından çağrılmışsa, arayan sıfır (yeniden tanımlanmamış) döner. Böylece elde edilen aramalar eksiktir.

Bu durumda işlevin çağrıldığı bir çerçevenin adını alabilir miyim? IHTMLDocument :: get_Script (Idispatch ** p)

Ama IActiveScript başarısız arayüzüne nesne "komut" döküm: Aktif Komut Teknoloji dayalı

Çözüm tipi ScriptEngine bir nesne verir.

* IE8'den verilen bir bağlam için kullanılacak bağlantı ScriptEngine, arama bilgilerini oluşturmak için gerekli bilgileri ayıklayabilir miyim?

+0

:-) Eminim bu iyi bir cevap almak ve topluma bir şeyler yayınlayın umut, ona ihtiyacımız! FYI, js-stack-trace ayrıca yığıntaki işlevlerden herhangi biri bir kereden fazla çağrılırsa hatalı yığın izlemesi verir çünkü "arayan özniteliğinin değeri bir yığın karesi değil, bir işlevdir, yığın yığınının alt kısmıdır. bazı işlevler tekrarlı olarak adlandırılırsa eksik olur. " (http://blog.yoursway.com/2009/07/3-painful-ways-to-obtain-stack-trace-in.html) – Hemlock

+0

Teşekkürler, Hemlock. Internet Explorer ve Java Script Engine'in etkileşimi ile ilgili daha fazla açıklama burada verilmiştir: http://blogs.msdn.com/b/jaiprakash/archive/2007/01/22/jscript-exceptions-not-handled-thrown- kareler arası-if-atılmış-a-expando-method.aspx ama bu sorunu çözmez :( – RostislavS

+2

Çapraz kare iletişimden kaçının en kolay çözüm olurdu. – Raynos

cevap

2

Kullanışlı olabilecek bir yol buldum. Geri çağırma fikrini kullanır.

her çerçevede bir sonraki basit bir fonksiyon tanımlama:

function getCaller() { return arguments.callee.caller; } 

ve sonraki işlevleri sadece üst çerçeve için:

function populateStack(fn) { 
    var perFrames = []; 
    for (var i = 0; i < windows.length; i++) { 
     var win = windows[i]; 
     var func = (win == this) ? fn : win.getCaller(); 
     var localStack = []; 
     while (func) { 
      localStack.push(getFuncName(func)); 
      func = func.caller; 
     } 
     perFrames.push(getWinName(win) + ": " + localStack.join(", ")); 
    } 
    alert(perFrames.join("\n")); 
} 

function getWinName(win) { 
    var m = win.location.toString().match(/^.*\/(.*)$/); 
    return m[1]; 
} 

function getFuncName(func) { 
    var m = func.toString().match(/^function\s*(\w*)\(/); 
    return m[1] || "anonymous"; 
} 

pencere tüm pencere nesneleri içeren üst çerçeve bir dizi olmalıdır (yani, çerçeveler). Kullanımı: Ben fonksiyonları denilen edildiği kesin düzeni, geri yüklemeye çalışırken, saat, bir çift geçirdim, ama hiç çözüm bulduk

window.top.populateStack.call(window, arguments.callee); 

. Bu kodda yalnızca kısmi sıralama (işlevler kareler içinde doğru şekilde sıralanır) kullanılabilir.

Farklı kod sürümlerine sahip birkaç sunucunuz varsa, işlev gövdelerini analiz edecek ve çağrı sırası hakkında daha fazla bilgi edinecek bir kod ekleyebilirsiniz.

Umut, bu yardımcı olur

+0

Teşekkürler, kirilloid.Belki de bu an için tek çözüm. – RostislavS

+0

IE8'deki ilginç hata: [Bir expando yönteminden atılan çerçeveler arasında JScript istisnaları işlenmedi/atılmadı] (http://blogs.msdn.com/b/jaiprakash/archive/2007/01/22/jscript-exceptions-not -handled-atılan boyunca çerçeveler eğer-den-a-expando-method.aspx atılır). Bu makalede, IE8'deki istisnalar sisteminin verimliliğini sorgular (IE9.b'de sabit görünüyor) – RostislavS

İlgili konular