8

Ich brauche eine vollständige Aufrufliste, wenn eine Ausnahme in JavaScript in Internet Explorer 8 auftritt. Funktionsaufrufe können zwischen Frames auftreten, deren Nummer groß ist.Full Callstack für mehrere Frames JS auf IE8

Aufrufstack erforderlich, um Protokolle an die Entwickler zu senden. Ich kann keinen Debugger verwenden, weil der Endbenutzer nicht mit diesem Problem umgehen muss.

Die aktuelle Lösung für JavaScripts vorausgesetzt, es kann Callstack (http://eriwen.com/javascript/js-stack-trace/) generieren. Es basiert auf arguments.callee.caller. Der Aufrufer gibt jedoch null (undefiniert) zurück, wenn die Funktion von außerhalb des aktuellen Rahmens aufgerufen wurde. Somit ist der erhaltene Callstack unvollständig.

Kann ich in diesem Fall den Namen eines Frames bekommen, von dem die Funktion aufgerufen wurde?

Lösung auf Basis Active Scripts Technologie gibt ein Objekt vom Typ Script: IHTMLDocument :: get_Script (IDispatch ** p)

Aber Gussobjekt "script" auf die Schnittstelle IActiveScript ausfällt.

* Kann ich aus IE8 den Link für einen bestimmten Kontext ScriptEngine erhalten, um die notwendigen Informationen zu extrahieren, um den Callstack zu konstruieren?

+0

Ich hoffe, du bekommst eine gute Antwort und postest etwas in der Community, wir brauchen es! FYI, js-stack-trace wird auch eine fehlerhafte Stack-Trace geben, wenn eine der Funktionen im Stack mehr als einmal aufgerufen wird, weil "der Wert des Caller-Attributs eine Funktion ist, kein Stack-Frame, also der untere Teil des Stack-Trace wird fehlen, wenn eine Funktion rekursiv aufgerufen wird. " (http://blog.yourway.com/2009/07/3-painful-ways-to-obtain-stack-trace-in.html) – Hemlock

+0

Danke, Hemlock. Weitere Erklärung für die Interaktion von Internet Explorer und Java Script Engine finden Sie hier: http://blogs.msdn.com/b/jaiprakash/archive/2007/01/22/jscript-exceptions-not-handled-thrown- across-frames-if-throw-from-a-expando-method.aspx aber das löst das Problem nicht :( – RostislavS

+2

Vermeiden Cross-Frame-Kommunikation wäre die einfachste Lösung. – Raynos

Antwort

2

Ich habe einen Weg gefunden, der nützlich sein kann. Es nutzt die Idee von Rückrufen.

definieren nächste einfache Funktion bei jedem Rahmen:

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

und neben Funktionen nur für oberen Rahmen:

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"; 
} 

Fenster sollen ein Array an dem oberen Rahmen werden alle Fensterobjekte enthält (dh Frames). Verbrauch:

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

ich ein Paar Stunden verbracht haben, versuchen, genau die Ordnung wieder herzustellen, in der Funktionen aufgerufen wurde, aber noch keine Lösung gefunden. Nur eine teilweise Reihenfolge (Funktionen sind innerhalb von Rahmen korrekt sortiert) ist in diesem Code verfügbar.

Wenn Sie mehrere Server mit verschiedenen Codeversionen haben, können Sie einen Code hinzufügen, der Funktionskörper analysiert und dadurch weitere Informationen zur Aufrufreihenfolge erhält.

Hoffe, das hilft :-)

+0

Danke, Kirilloid.Vielleicht ist es die einzige Lösung für diesen Moment. – RostislavS

+0

Interessanter Fehler in IE8: [JScript-Ausnahmen werden nicht behandelt/über Frames hinweg geworfen, wenn sie von einer expando-Methode ausgelöst werden] (http://blogs.msdn.com/b/jaiprakash/archive/2007/01/22/jscript-exceptions-not -handled-geworfen-über-Frames-if-geworfen-from-a-expando-method.aspx). Dieser Artikel stellt die Effizienz des Ausnahmesystems in IE8 in Frage (in IE9.b scheint behoben zu sein) – RostislavS

Verwandte Themen