您的位置:首页 > 移动开发

End-to-End Tracing of Ajax/Java Applications Using DTrace

2017-09-10 21:51 441 查看

End-to-End Tracing of Ajax/Java Applications Using DTrace

Category: Utility



We posted about using DTrace to profile Firefox in the past, and

today Amit Hurvitz published a piece on Ajax, DTrace and Where They Meet.

JAVASCRIPT

#!/usr/sbin/dtrace -Zs

#pragma D option quiet

#pragma D option switchrate=10

dtrace:::BEGIN

{

jsIndent = 0;

jsFile = "ajax-validation";

javaMethodBoundary= "doGet";

startTimestamp = timestamp;

}

*mozilla$1:::js_function-entry

/basename(copyinstr(arg0)) == jsFile/

{

jsIndent += 2;

printf("%*s -> %s:%s (JavaScript)(elapsed ms: %d)\n", jsIndent, "",

jsFile, copyinstr(arg2), (timestamp - startTimestamp) / 1000);

}

*mozilla$1:::js_function-return

/basename(copyinstr(arg0)) == jsFile/

{

printf("%*s < - %s:%s (JavaScript)(elapsed ms: %d)\n", jsIndent, "",

jsFile, copyinstr(arg2), (timestamp - startTimestamp) / 1000);

jsIndent -= 2;

}

hotspot$2:::method-entry

{

self->strPtr = (char *)copyin(arg1, args[2]+1);

self->strPtr[(int)args[2]] = '\0';

self->classStr = (string)self->strPtr;

self->strPtr = (char *)copyin(arg3, (int)args[4]+1);

self->strPtr[(int)args[4]] = '\0';

self->methodStr = (string)self->strPtr;

}

hotspot$2:::method-entry

/javaMethodBoundary == self->methodStr/

{

self->interested = 1;

self->indent = 0;

}

hotspot$2:::method-entry

/self->interested/

{

self->indent += 2;

printf("%*s -> %s:%s (Java)(elapsed ms: %d)\n", self->indent, "",

self->classStr, self->methodStr, (timestamp - startTimestamp) / 1000);

}

hotspot$2:::method-return

{

self->strPtr = (char *)copyin(arg1, args[2]+1);

self->strPtr[(int)args[2]] = '\0';

self->classStr = (string)self->strPtr;

self->strPtr = (char *)copyin(arg3, (int)args[4]+1);

self->strPtr[(int)args[4]] = '\0';

self->methodStr = (string)self->strPtr;

}

hotspot$2:::method-return

/self->interested/

{

printf("%*s < - %s:%s (Java)(elapsed ms: %d)\n", self->indent, "",

self->classStr, self->methodStr, (timestamp - startTimestamp) / 1000);

self->indent -= 2;

}

hotspot$2:::method-return

/javaMethodBoundary == self->methodStr/

{

self->interested = 0;

/* exit(0); */

}

It then continues to show timings of methods and such. This may not be the simplest solution for debugging, but at least you can get inside the black box when you need too.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐