//如果当前函数是有名函数,则返回其名字,如果是匿名函数则返回被赋值的函数变量名,如果是闭包中匿名函数则返回“anonymous”。
var getFnName = function(callee){
var _callee = callee.toString().replace(/[\s\?]*/g,""),
comb = _callee.length >= 50 ? 50 :_callee.length;
_callee = _callee.substring(0,comb);
var name = _callee.match(/^function([^\(]+?)\(/);
if(name && name[1]){
return name[1];
}
var caller = callee.caller,
_caller = caller.toString().replace(/[\s\?]*/g,"");
var last = _caller.indexOf(_callee),
str = _caller.substring(last-30,last);
name = str.match(/var([^\=]+?)\=/);
if(name && name[1]){
return name[1];
}
return "anonymous"
};
// 取得某行代码在原文件的位置 getGlobalIID返回字符串giid 来识别静态程序的回调 iidToLocation 返回原始脚本文件的路径
function iidToLoc(iid) {
return J$.iidToLocation(J$.getGlobalIID(iid));
}
//判断变量是全局变量还是局部变量
if(window.value===value)
//调用send()函数和addVariable()函数将该行执行前变量写道追踪
//当一个对象访问方法或属性时,如果这个方法或属性与DOM相关且对象的值为null,则将FRITURE标记写入追踪。
function doSomething(){
var lastErrorHandler = window.onerror;
window.onerror = function(message,url,line){
// 汇报错误
alert("执行" + url + "文件中的第" + line + "行代码出错,错误信息:" + message);
window.onerror = lastErrorHandler;
// 不希望此错误继续扩散
return true;
};
// 不小心出错了...
sldfjlskdjflj;
window.onerror = lastErrorHandler;
}
doSomething();
var RCA_timerID_global = 1;
var oldSetTimeout = window.setTimeout;
window.setTimeout = function(func, delay) {
var i = 0;
var arg0_length = arguments[0].lastIndexOf(')');//返回某个指定的字符串值在字符串中首次出现的位置。
var prev_char = arguments[0].charAt(arg0_length-1);//返回指定位置的字符
arguments[0] = arguments[0].substring(0,arg0_length);//用于提取字符串中介于两个指定下标之间的字符
if (prev_char == '(') {//没有参数
arguments[0] = arguments[0] + RCA_timerID_global + ")";
}
else {//有参数
arguments[0] = arguments[0] + "," + RCA_timerID_global + ")";
}
//http://www.jb51.net/article/42705.htm
return oldSetTimeout.apply(this, arguments);
};
//每个函数开始时检查形参列表,如果是异步调用将ASYNC标记写入追踪
this.functionEnter = function (iid, f, dis, args) {
var i = 0;
var arg0_length = arguments[0].lastIndexOf(')');//返回某个指定的字符串值在字符串中最后出现的位置。
var arg0_dot = arguments[0].lastIndexOf(',');
var prev_char = arguments[0].charAt(arg0_length-1);//返回指定位置的字符
var async = arguments[0].substring(arg0_dot,arg0_length);//截取最后一个形参
arguments[0] = arguments[0].substring(0,arg0_length);//用于提取字符串中介于两个指定下标之间的字符
if (prev_char == '(') {//没有参数
return;
}
else if(async){//最后形参为异步调用标记
//写入追踪
var fun_name = getFunName(iid);
send(addVariable(fun_name,async));
}else{
return;
}
};
window.xhr = new XMLHttpRequest();
window.buffer = new Array();
function send(value) {
window.buffer.push(value);
if(window.buffer.length == 200) {
sendReally();
}
}
function sendReally() {
window.xhr.open('POST', document.location.href + '?thisisanexecutiontracingcall', false);
window.xhr.send(JSON.stringify(window.buffer));
window.buffer = new Array();
}
function addVariable(name, value) {//添加变量到列表,形式(变量名,类型,值)
if(typeof(value) == 'object') {
if(value instanceof Array) {
if(value.length > 0) {
return new Array(name, typeof(value[0]) + '_array', value);
} else {
return new Array(name, 'object_array', value);
}
}
} else if(typeof(value) != 'undefined' && typeof(value) != 'function') {
return new Array(name, typeof(value), value);
}
return new Array(name, typeof(value), 'undefined');
};