如何修复已启用探测器的错误:地址无效 (0x0)?
How to fix error on enabled probe: invalid address (0x0)?
我有以下错误:
dtrace: error on enabled probe ID 3 (ID 7343: php15810:php:dtrace_execute_ex:function-return): invalid address (0x0) in action #2 at DIF offset 24
当我试图跟踪我的 PHP 脚本时 (sudo ./trace-php.d
)。
基本上我想实现的是通过PHP函数显示分布time/count。它似乎有效,但我对这个错误感到恼火。我知道我可以将它发送到 /dev/null
,但我想了解并修复它。
这是我的 dtrace 代码:
#!/usr/sbin/dtrace -Zs
#pragma D option quiet
php*:::function-entry
{
self->vts = timestamp;
self->cmd = arg0
}
php*:::function-return
/self->vts/
{
@time[copyinstr(self->cmd)] = quantize(timestamp - self->vts);
@num = count();
self->vts = 0;
self->cmd = 0;
}
profile:::tick-2s
{
printf("\nPHP commands/second total: ");
printa("%@d; commands latency (ns) by pid & cmd:", @num);
printa(@time);
clear(@time);
clear(@num);
}
示例输出(而 运行 一些 php 脚本)是:
dtrace: error on enabled probe ID 3 (ID 7343: php15810:php:dtrace_execute_ex:function-return): invalid address (0x0) in action #2 at DIF offset 24
dtrace: error on enabled probe ID 3 (ID 7343: php15810:php:dtrace_execute_ex:function-return): invalid address (0x0) in action #2 at DIF offset 24
dtrace: error on enabled probe ID 3 (ID 7343: php15810:php:dtrace_execute_ex:function-return): invalid address (0x0) in action #2 at DIF offset 24
dtrace: error on enabled probe ID 3 (ID 7343: php15810:php:dtrace_execute_ex:function-return): invalid address (0x0) in action #2 at DIF offset 24
PHP commands/second total: 1549; commands latency (ns) by pid & cmd:
variable_get
value ------------- Distribution ------------- count
1024 | 0
2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
4096 |@@@@@@@ 1
8192 |@@@@@@@ 1
16384 | 0
__construct
value ------------- Distribution ------------- count
1024 | 0
2048 |@@@@@@@@@@@@@@@@@@@@ 3
4096 |@@@@@@@@@@@@@ 2
8192 |@@@@@@@ 1
16384 | 0
features_array_diff_assoc_recursive
value ------------- Distribution ------------- count
16384 | 0
32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
65536 | 0
features_export_info
value ------------- Distribution ------------- count
2048 | 0
4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 122
8192 |@@@@@@ 23
16384 |@ 4
32768 | 0
通过将 php*:::function-return 探针分解成不同的子句,这可能会达到您的要求 - 一个用于是否要打印输出(基于参数是否已定义),第二个是清除线程局部变量,无论您在第一个探测子句中做了什么或没有做什么。
这利用了 DTrace 以您定义子句的确切顺序为每个探测器执行代码这一事实。
此示例还使用了 probefunc 和线程 ID (tid) 的唯一组合键作为您的自变量,因此您不必' 在进入函数调用时不小心覆盖了这些线程局部变量:
#!/usr/sbin/dtrace -Zs
#pragma D option quiet
php*:::function-entry
{
self->vts[tid,probefunc] = timestamp;
self->cmd[tid,probefunc] = arg0
}
php*:::function-return
/self->vts[tid,probefunc] && self->cmd[tid,probefunc]/
{
@time[copyinstr(self->cmd[tid,probefunc])] =
quantize(timestamp - self->vts[tid,probefunc]);
@num = count();
}
php*:::function-return
/self->vts[tid,probefunc]/
{
self->vts[tid,probefunc] = 0;
self->cmd[tid,probefunc] = 0;
}
profile:::tick-2s
{
printf("\nPHP commands/second total: ");
printa("%@d; commands latency (ns) by pid & cmd:", @num);
printa(@time);
clear(@time);
clear(@num);
}
如果任何 PHP 函数已经过尾调用优化,上述方法可能无法正常工作。要查看您是否属于这种情况,运行 这个:
#!/usr/sbin/dtrace -s
#pragma D option quiet
php*:::function-entry
{
@e[probefunc,probename] = count();
}
php*:::function-return
{
@r[probefunc,probename] = count();
}
tick-10sec
{
printf("ENTRY POINTS\n");
printa(@e);
printf("RETURN POINTS\n");
printa(@r);
exit(0);
}
对条目和 return 点进行排序 - 计数不必完全匹配,但您希望每个探测函数和名称组合都在条目和 return 点之间匹配.特别警惕任何未列出 return 点的内容。这些很可能是尾调用优化的,您需要将它们排除在分析之外,因为您永远无法对它们进行计时。
我有以下错误:
dtrace: error on enabled probe ID 3 (ID 7343: php15810:php:dtrace_execute_ex:function-return): invalid address (0x0) in action #2 at DIF offset 24
当我试图跟踪我的 PHP 脚本时 (sudo ./trace-php.d
)。
基本上我想实现的是通过PHP函数显示分布time/count。它似乎有效,但我对这个错误感到恼火。我知道我可以将它发送到 /dev/null
,但我想了解并修复它。
这是我的 dtrace 代码:
#!/usr/sbin/dtrace -Zs
#pragma D option quiet
php*:::function-entry
{
self->vts = timestamp;
self->cmd = arg0
}
php*:::function-return
/self->vts/
{
@time[copyinstr(self->cmd)] = quantize(timestamp - self->vts);
@num = count();
self->vts = 0;
self->cmd = 0;
}
profile:::tick-2s
{
printf("\nPHP commands/second total: ");
printa("%@d; commands latency (ns) by pid & cmd:", @num);
printa(@time);
clear(@time);
clear(@num);
}
示例输出(而 运行 一些 php 脚本)是:
dtrace: error on enabled probe ID 3 (ID 7343: php15810:php:dtrace_execute_ex:function-return): invalid address (0x0) in action #2 at DIF offset 24
dtrace: error on enabled probe ID 3 (ID 7343: php15810:php:dtrace_execute_ex:function-return): invalid address (0x0) in action #2 at DIF offset 24
dtrace: error on enabled probe ID 3 (ID 7343: php15810:php:dtrace_execute_ex:function-return): invalid address (0x0) in action #2 at DIF offset 24
dtrace: error on enabled probe ID 3 (ID 7343: php15810:php:dtrace_execute_ex:function-return): invalid address (0x0) in action #2 at DIF offset 24
PHP commands/second total: 1549; commands latency (ns) by pid & cmd:
variable_get
value ------------- Distribution ------------- count
1024 | 0
2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
4096 |@@@@@@@ 1
8192 |@@@@@@@ 1
16384 | 0
__construct
value ------------- Distribution ------------- count
1024 | 0
2048 |@@@@@@@@@@@@@@@@@@@@ 3
4096 |@@@@@@@@@@@@@ 2
8192 |@@@@@@@ 1
16384 | 0
features_array_diff_assoc_recursive
value ------------- Distribution ------------- count
16384 | 0
32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
65536 | 0
features_export_info
value ------------- Distribution ------------- count
2048 | 0
4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 122
8192 |@@@@@@ 23
16384 |@ 4
32768 | 0
通过将 php*:::function-return 探针分解成不同的子句,这可能会达到您的要求 - 一个用于是否要打印输出(基于参数是否已定义),第二个是清除线程局部变量,无论您在第一个探测子句中做了什么或没有做什么。
这利用了 DTrace 以您定义子句的确切顺序为每个探测器执行代码这一事实。
此示例还使用了 probefunc 和线程 ID (tid) 的唯一组合键作为您的自变量,因此您不必' 在进入函数调用时不小心覆盖了这些线程局部变量:
#!/usr/sbin/dtrace -Zs
#pragma D option quiet
php*:::function-entry
{
self->vts[tid,probefunc] = timestamp;
self->cmd[tid,probefunc] = arg0
}
php*:::function-return
/self->vts[tid,probefunc] && self->cmd[tid,probefunc]/
{
@time[copyinstr(self->cmd[tid,probefunc])] =
quantize(timestamp - self->vts[tid,probefunc]);
@num = count();
}
php*:::function-return
/self->vts[tid,probefunc]/
{
self->vts[tid,probefunc] = 0;
self->cmd[tid,probefunc] = 0;
}
profile:::tick-2s
{
printf("\nPHP commands/second total: ");
printa("%@d; commands latency (ns) by pid & cmd:", @num);
printa(@time);
clear(@time);
clear(@num);
}
如果任何 PHP 函数已经过尾调用优化,上述方法可能无法正常工作。要查看您是否属于这种情况,运行 这个:
#!/usr/sbin/dtrace -s
#pragma D option quiet
php*:::function-entry
{
@e[probefunc,probename] = count();
}
php*:::function-return
{
@r[probefunc,probename] = count();
}
tick-10sec
{
printf("ENTRY POINTS\n");
printa(@e);
printf("RETURN POINTS\n");
printa(@r);
exit(0);
}
对条目和 return 点进行排序 - 计数不必完全匹配,但您希望每个探测函数和名称组合都在条目和 return 点之间匹配.特别警惕任何未列出 return 点的内容。这些很可能是尾调用优化的,您需要将它们排除在分析之外,因为您永远无法对它们进行计时。