如何修复已启用探测器上的错误:无效地址 (0x0)?
Posted
技术标签:
【中文标题】如何修复已启用探测器上的错误:无效地址 (0x0)?【英文标题】:How to fix error on enabled probe: invalid address (0x0)? 【发布时间】:2016-04-08 17:29:26 【问题描述】:我有以下错误:
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 函数显示分发时间/计数。它似乎有效,但我对这个错误感到恼火。我知道我可以将它发送到/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
【问题讨论】:
arg0
是否曾经NULL
?
这是function_name,所以我不确定。
它似乎不应该是NULL
...有没有可能当你拨打copyinstr()
时它已经失效了?
不确定,每个函数返回应该早于 self->cmd。我怎么知道它发生在哪一行/哪里?我认为 DIF 偏移量 24 处的动作 #2 毫无意义。
您只是在copyinstr()
调用中使用了一个指针。这可能是相关的,尽管在这种情况下地址不是0x0
:***.com/questions/1198114/… 您可以尝试将copyinstr()
移动到function-entry
探针,或将/ arg0 /
添加到function-entry
探针。我怀疑您可能会看到 PHP “引导”本身,并在它填充某种符号表之前进行 PHP 调用。使用/ arg0 == 0 /
添加一个额外的function-entry
探针,它发出或存储来自ustack()
的结果。
【参考方案1】:
通过将 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);
对入口点和返回点进行排序 - 计数不必完全匹配,但您希望每个探测函数和名称组合在入口点和返回点之间都有匹配。要特别警惕任何没有列出返回点的东西。这些很可能是尾调用优化的,您需要从分析中排除它们,因为您永远无法对它们进行计时。
【讨论】:
太好了,谢谢。我想对其进行测试,但除了消息之外,它不打印任何数据(在运行一些 php 时)。预计会这样吗? 可能不会。尝试在不使用 quiet 选项的情况下运行它,看看实际激活了多少探针。我不使用 DTrace 运行 PHP(主要是 C/C++/Fortran/Perl),所以也许该提供商有一些我不习惯的怪癖。以上是关于如何修复已启用探测器上的错误:无效地址 (0x0)?的主要内容,如果未能解决你的问题,请参考以下文章
如果已启用,如何修复“当前未启用对实验语法 'classProperties' 的支持”错误?
iOS 错误 - CGContextRestoreGState:无效上下文 0x0
<错误>:CGContextSaveGState:无效上下文 0x0 错误