2016-04-08 17 views
0

Ich habe folgende Fehlermeldung:So beheben Sie Fehler bei aktiviertem Probe: ungültige Adresse (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

wenn ich versuche, mein PHP-Skript zu verfolgen (sudo ./trace-php.d).

Grundsätzlich, was ich erreichen wollte, ist die Verteilung Zeit/Anzahl von PHP-Funktion anzuzeigen. Es scheint zu funktionieren, aber ich ärgere mich über diesen Fehler. Ich weiß, dass ich es an /dev/null senden kann, aber ich möchte es verstehen und beheben.

Hier ist mein dtrace Code:

#!/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); 
} 

Beispielausgabe (während einige PHP-Skript ausgeführt wird) ist:

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

Ist 'arg0' jemals' NULL'? –

+0

Es ist ein [Funktionsname] (http://php.net/manual/en/features.dtrace.dtrace.php), also bin ich mir nicht sicher. – kenorb

+0

Es scheint, dass * es * nicht 'NULL' sein sollte ... Ist es möglich, dass, wenn Sie den' copyinstr() 'Aufruf machen, es ungültig wird? –

Antwort

1

Dies wird wahrscheinlich tun, was Sie wollen, indem Sie die php Zerschlagung * ::: function-return Probieren Sie in verschiedene Klauseln - eine für, ob Sie die Ausgabe drucken möchten oder nicht (basierend darauf, ob das Argument definiert ist oder nicht), und die zweite, um Ihre Thread lokalen Variablen unabhängig von was zu klären Du hast oder hast es nicht getan Prüfklausel

Dies nutzt die Tatsache, dass DTrace Code für jede Sonde in genau der Reihenfolge ausführt, in der Sie die Klauseln definieren.

In diesem Beispiel wird auch eine einzigartige Tastenkombination des probefunc und Thread-ID (tid) für Ihre Selbst Variablen, so dass Sie nicht versehentlich diese Thread lokalen Variablen überschreiben Sie, wie Sie in Funktion absteigen ruft:

#!/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); 
} 

Das oben genannte funktioniert möglicherweise nicht gut, wenn eine der PHP-Funktionen Tail Call Optimized ist. Um zu sehen, wenn Sie zu dieser Bedingung sind, dann laufen diese:

#!/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); 
} 

sortieren Sie den Eintrag und die Rück Punkte - die Zählungen müssen nicht genau übereinstimmen, aber Sie wollen jede einzelne Probe-Funktion und Namenskombination haben eine Übereinstimmung zwischen den Eintritts- und Rückkehrpunkten. Seien Sie besonders vorsichtig, wenn Sie keinen Rückgabepunkt angegeben haben. Diese sind wahrscheinlich Tail Call Optimized und Sie möchten diese aus Ihrer Analyse ausschließen, da Sie sie nie zeitlich festlegen können.

+0

Das ist großartig, danke. Ich möchte es testen, aber es druckt keine Daten (während einige PHP laufen), abgesehen von der Nachricht. Soll es so sein? – kenorb

+0

Wahrscheinlich nicht. Versuchen Sie es ohne die leisure-Option auszuführen und sehen Sie, wie viele Sonden tatsächlich aktiviert werden.Ich betreibe kein PHP (hauptsächlich C/C++/Fortran/Perl) mit DTrace, also hat dieser Provider vielleicht einige Eigenheiten, an die ich nicht gewöhnt bin. –