2016-04-08 15 views
0

私は次のエラーをした:私は私のPHPスクリプト(sudo ./trace-php.d)を追跡しようとしているとき有効プローブでエラーを修正する方法:無効なアドレス(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関数により配布時間/回数を表示することです。それはうまくいくようですが、私はこのエラーに悩まされます。私は/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を壊すことで、あなたがやりたいだろう* :::異なる句に関数の戻りプローブ - あなたは(引数があるか定義されていないかどうかに基づいて)出力かどうかを印刷するかどうかに1つ、2つ目は関係なく、あなたのスレッドローカル変数をクリアするにはどのようなあなたは最初にやった、またはやらなかったプローブ節。

これは、DTraceのは、あなたが句を定義する正確な順序で各プローブのコードを実行されるという事実を利用します。

この例はまた、あなたの自己変数のあるprobefuncとスレッドID(TID)のユニークなキーの組み合わせを使用していますので、あなたが関数に下ると、あなたが誤ってこれらのスレッドローカル変数を上書きしない呼び出します。

PHP関数のいずれかが、末尾呼び出し最適化されている場合
#!/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); 
} 

上記うまく動作しない場合があります。あなたはこの条件の対象としているかどうかを確認するには、これを実行します。

#!/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)を実行しないので、おそらくそのプロバイダには慣れていないいくつかの欠点があります。 –

関連する問題