Название провайдера сопряжено с идентификатором процесса firefox-bin, датчики вводятся для основных функций, также есть датчики function-entry, function-info, function-return, function-rval, object-create, object-create-start, object-createdone и object- finalize.
Информацию об аргументах датчика можно получить командой dtrace с ключами –l -v, вводя их перед ключом –n:
# dtrace -l -v -n 'javascript*:::execute-start'
ID PROVIDER MODULE FUNCTION NAME
36 javascript593 libmozjs.so jsdtrace_execute_start execute-start
Probe Description Attributes
Identifier Names: Private
Data Semantics: Private
Dependency Class: Unknown
Argument Attributes
Identifier Names: Private
Data Semantics: Private
Dependency Class: Unknown
Argument Types
args[0]: char *
args[1]: int
37 javascript593 libmozjs.so js_Execute execute-start
Probe Description Attributes
Identifier Names: Private
Data Semantics: Private
Dependency Class: Unknown
Argument Attributes
Identifier Names: Private
Data Semantics: Private
Dependency Class: Unknown
Argument Types
args[0]: char *
args[1]: int
Датчики и их аргументы
javascript*:::function-entry
Аргументы: char *filename, char *classname, char *funcname
javascript*:::function-return
Аргументы: char *filename, char *classname, char *funcname
javascript*:::function-info
Аргументы: char *filename, char *classname, char *funcname, int lineno, char *runfilename, int runlineno
javascript*:::function-args
Аргументы: char *filename, char *classname, char *funcname, int argc, void *argv, void *argv0, void *argv1, void *argv2, void *argv3, void *argv4
javascript*:::function-rval //показывает возвращаемое функцией значение
Аргументы: char *filename, char *classname, char *funcname, int lineno, void *rval, void *rval0
javascript*:::object-create
Аргументы: char *filename, char *classname, uintptr_t *object, int rlineno
javascript*:::object-create-start
Аргументы: char *filename, char *classname
javascript*:::object-create-done //показывает время, затраченное на создание объекта
Аргументы: char *filename, char *classname
javascript*:::object-finalize //трассировка работы сборщика мусора
Аргументы: NULL, char *classname, uintptr_t *object
javascript*:::execute-start
Аргументы: char *filename, int lineno
javascript*:::execute-done
Аргументы: char *filename, int lineno
Скрипт, используемый для трассировки, был взят
отсюда и запущен в firefox-3.0a8pre.en-US.solaris2.11-dtrace-i386.
1. Подсчет числа вызовов функции во время работы скрипта.
calls.d
*javascript*:::function-entry
{
@funcs[basename(copyinstr(arg0)), copyinstr(arg2)] = count();
}
dtrace:::END
{
printf(" %-32s %-36s %8s\n", "FILE", "FUNC", "CALLS");
printa(" %-32s %-36s %@8d\n", @funcs);
exit (0);
}
Результат его работы:
FILE FUNC CALLS
browser.js FillInHTMLTooltip 1
browser.js getElementById 1
nsMicrosummaryService.js MSS__getBookmarks 2
nsMicrosummaryService.js MSS__updateMicrosummaries 2
nsMicrosummaryService.js getItemsWithAnnotation 2
nsMicrosummaryService.js getPref 2
nsMicrosummaryService.js getPrefType 2
nsMicrosummaryService.js getService 2
nsMicrosummaryService.js max 2
nsMicrosummaryService.js now 2
<…>
2. Трассировка процесса выполнения функции
funcflow.d
*javascript*:::function-entry
{
depth++;
printf("%d %-20Y %-22s %*s-> %s\n", cpu, walltimestamp,
basename(copyinstr(arg0)), depth*2, "", copyinstr(arg2));
}
*javascript*:::function-return
{
printf("%d %-20Y %-22s %*s<- %s\n", cpu, walltimestamp,
basename(copyinstr(arg0)), depth*2, "", copyinstr(arg2));
depth--;
exit (0);
}
Результат работы скрипта:
0 66348 jsdtrace_function_entry:function-entry 0 2008 Jul 31 22:58:25 world_time.htm
-> getDay
0 66348 jsdtrace_function_entry:function-entry 0 2008 Jul 31 22:58:25 world_time.htm
-> getMonth
0 66348 jsdtrace_function_entry:function-entry 0 2008 Jul 31 22:58:25 world_time.htm
0 66352 jsdtrace_function_return:function-return 0 2008 Jul 31 22:58:25 world_time.htm
-> setTimeout
0 66352 jsdtrace_function_return:function-return 0 2008 Jul 31 22:58:25 world_time.
<- setTimeout
0 66352 jsdtrace_function_return:function-return 0 2008 Jul 31 22:58:25 world_time.htm
<- SystemClock
0 66348 jsdtrace_function_entry:function-entry 0 2008 Jul 31 22:58:25 world_time.htm
-> TSCClock
<…>
Например, в первой строке 0 – CPU ID, 66348 – идентификатор провайдера, сопряженный с идентификатором процесса firefox-bin, jsdtrace_function_entry:function-entry – используемая функция DTrace, 2008 Jul 31 22:58:25 - время ее запуска, world_time.htm - файл .htm, getDay - трассируемая функция Javascript.
3. Трассировка создания объекта.
objs.d
dtrace:::BEGIN
{
printf("%-20s %24s:%-7s %s\n", "TIME", "FILE", "LINENUMBER", "CLASS");
}
*javascript*:::object-create
/arg2/
{
printf("%-20Y %24.24s:%-7d %s\n", walltimestamp,
basename(copyinstr(arg0)), (int)arg3, copyinstr(arg1));
}
Результат работы скрипта:
CPU ID FUNCTION:NAME TIME FILE:LINENUMBER CLASS
0 66356 jsdtrace_object_create:object-create 2008 Jul 31 23:14:02 world_time.htm:578 Date
0 66356 jsdtrace_object_create:object-create 2008 Jul 31 23:14:02 world_time.htm:682 Date
0 66356 jsdtrace_object_create:object-create 2008 Jul 31 23:14:02 world_time.htm:690 Date
0 66356 jsdtrace_object_create:object-create 2008 Jul 31 23:14:02 world_time.htm:604 Date
0 66356 jsdtrace_object_create:object-create 2008 Jul 31 23:14:02 world_time.htm:612 Date
0 66356 jsdtrace_object_create:object-create 2008 Jul 31 23:14:03 world_time.htm:578 Date
<…>
4. Подсчет числа созданных объектов.
objnew.d
*javascript*:::object-create
{
@objs[basename(copyinstr(arg0)), copyinstr(arg1)] = count();
}
dtrace:::END
{
printf(" %-24s %-36s %8s\n", "FILE", "CLASS", "COUNT");
printa(" %-24.24s %-36s %@8d\n", @objs);
}
Результат работы скрипта:
FILE CLASS COUNT
nsMicrosummaryService.js Array 1
nsMicrosummaryService.js Object 1
null MouseEvent 2
null Function 4
world_time.htm Date 70
5. Определение процессорного времени, затраченного на создание объектов.
objcpu.d
*javascript*:::object-create-start
{
self->vstart = vtimestamp;
}
*javascript*:::object-create-done
/self->vstart/
{
this->oncpu = vtimestamp - self->vstart;
@dist["Object Creation time:"] = quantize(this->oncpu);
@total["Total time:"] = sum(this->oncpu);
self->vstart = 0;
}
dtrace:::END
{
normalize(@total, 1000);
}
Результат работы скрипта:
Object Creation time:
value ------------- Distribution ------------- count
32768 | 0
65536 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 26
131072 |@ 1
262144 | 0
Total time: 2134
6. Анализ работы сборщика мусора.
objgc.d
*javascript*:::object-create
/arg2/
{
this->file = basename(copyinstr(arg0));
@objs[this->file, copyinstr(arg1)] = sum(1);
filename[arg2] = this->file;
}
*javascript*:::object-finalize
/filename[arg2] == NULL/
{
@objs["", copyinstr(arg1)] = sum(-1);
}
*javascript*:::object-finalize
/filename[arg2] != NULL/
{
@objs[filename[arg2], copyinstr(arg1)] = sum(-1);
filename[arg2] = 0;
}
profile:::tick-1sec,
dtrace:::END
{
printf("\n %-24s %-36s %8s\n", "FILE", "CLASS", "TOTAL");
printa(" %-24.24s %-36s %@8d\n", @objs);
}
Результат работы скрипта:
CPU ID FILE CLASS TOTAL
0 66366 world_time.htm Date 5
0 66366 world_time.htm Date 10
0 66366 world_time.htm Date 15
0 66366 world_time.htm Date 20
0 66366 world_time.htm Date 25
0 66366 world_time.htm Date 30
0 66366 world_time.htm Date 35
<…>
Если имя файла не указано (missed), это означает, что объекты уже находились в памяти во время запуска скрипта. Значение TOTAL в этом случае бывает отрицательным, потому что трассируется не создание, а уничтожение объектов.