前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >追踪收集解决方法

追踪收集解决方法

作者头像
SuperHeroes
发布2018-05-30 17:00:50
4790
发布2018-05-30 17:00:50
举报
文章被收录于专栏:云霄雨霁云霄雨霁

包含该行的函数

代码语言:javascript
复制
//如果当前函数是有名函数,则返回其名字,如果是匿名函数则返回被赋值的函数变量名,如果是闭包中匿名函数则返回“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"
    };

相对于其所属函数的行号

代码语言:javascript
复制
// 取得某行代码在原文件的位置 getGlobalIID返回字符串giid 来识别静态程序的回调 iidToLocation 返回原始脚本文件的路径

    function iidToLoc(iid) {

        return J$.iidToLocation(J$.getGlobalIID(iid));

    }

函数范围内的所有变量名称和范围( 全局或局部)

代码语言:javascript
复制
//判断变量是全局变量还是局部变量
if(window.value===value)

在执行该行之前这些变量的值

代码语言:javascript
复制
//调用send()函数和addVariable()函数将该行执行前变量写道追踪

FAILURE标记

代码语言:javascript
复制
//当一个对象访问方法或属性时,如果这个方法或属性与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();

ASYNCALL标记

代码语言:javascript
复制
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标记

代码语言:javascript
复制
//每个函数开始时检查形参列表,如果是异步调用将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;
     }
};

写入追踪

代码语言:javascript
复制
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');
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.08.07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 包含该行的函数
  • 相对于其所属函数的行号
  • 函数范围内的所有变量名称和范围( 全局或局部)
  • 在执行该行之前这些变量的值
  • FAILURE标记
  • ASYNCALL标记
  • ASYNC标记
  • 写入追踪
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档