2016-04-08 61 views
0

我有以下错误:如何修复启用的探针错误:无效地址(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函数显示分配时间/计数。它似乎工作,但我很烦恼这个错误。我知道我可以发送到/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  
+0

'arg0'曾经'NULL'? –

+0

这是[function_name](http://php.net/manual/en/features.dtrace.dtrace.php),所以我不确定。 – kenorb

+0

它看起来*不应该*为'NULL' ...是否有可能,当你使'copyinstr()'调用它变得无效? –

回答

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); 
} 

排序的入口和返回点 - 计数不必完全一致,但希望每一个探头的功能和名称组合有入场和回归点之间的匹配。对没有列出返回点的任何物品特别谨慎。这些最有可能的尾巴呼叫优化,你会想要从你的分析中排除这些,因为你永远无法计算它们。

+0

太好了,谢谢。我想测试它,但它不会打印任何数据(同时运行一些PHP),除了消息。预计会是这样吗? – kenorb

+0

可能不是。尝试在没有安静选项的情况下运行它,并查看实际激活的探测器数量。我不使用DTrace运行PHP(主要是C/C++/Fortran/Perl),所以也许这个提供者有一些我不习惯的怪癖。 –

相关问题