2016-04-08 16 views
0

aşağıdaki hatayı ettik: benim PHP komut dosyası (sudo ./trace-php.d) iz çalışıyorum zamanEtkinleştirilmiş probda hata nasıl giderilir: geçersiz adres (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

.

Temel olarak benim elde etmek istediğim, PHP işlevine göre dağıtım süresini/sayısını görüntülemek. İşe yarayacak gibi görünüyor, ama bu hatadan rahatsız oluyorum. Bunu /dev/null'a gönderebileceğimi biliyorum, ancak bunu anlamak ve düzeltmek istiyorum. (Bazı php komut dosyası çalışırken) 'dir

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

Örnek çıktı:

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' hiç' NULL' mu? –

+0

Bu bir [function_name] (http://php.net/manual/en/features.dtrace.dtrace.php), bu yüzden emin değilim. – kenorb

+0

Görünüşe göre * * 'NULL' olmamalı ... 'copyinstr()' çağrısı yaptığınız zaman geçersiz olur mu? –

cevap

1

Bu ne istersen yap olasılıkla, php yukarı kırarak * İşte

benim DTrace kodudur ::: işlev döndürme farklı cümlelere dönüşür - biri çıktıyı yazdırmak isteyip istemediğinizi (bağımsız değişkenin tanımlanıp tanımlanmadığına göre), ikincisi ne olursa olsun iş parçacığı yerel değişkenlerinizi temizler. ilk sen yaptın ya da yapmadın prob cümlesi.

Bu, DTrace'nin, her bir sonda için, maddeleri tanımladığınız sırayla kod yürütmesi avantajından yararlanır.

işleve içine iner gibi yanlışlıkla bu parçacığı yerel değişkenler üzerine kalmamak Bu örnek, kendi kendine değişkenler için probefunc ve iplik kimliği (tid) eşsiz bir tuş kombinasyonunu kullanır çağırır :

#!/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 işlevlerinden herhangi birinin Kuyruk Çağrısı Optimize Edilmiş olması durumunda yukarıdakiler iyi çalışmayabilir. Bu durum tabi olup olmadığını görmek için, bu çalıştırın:

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

Sıralama girişi ve dönüş noktaları - sayımları tam olarak eşleşmesi gerekmez, ancak her tek prob fonksiyonu ve adı kombinasyonu sahip olmak istiyorum Giriş ve dönüş noktaları arasında bir eşleşme. Listelenen bir dönüş noktası olmayan herhangi birinden özellikle dikkatli olun. Bunlar büyük olasılıkla Kuyruk Çağrısı Optimize Edilmişlerdir ve bunları asla değerlendiremeyeceğiniz için analizinizdekileri hariç tutmak isteyeceksiniz.

+0

Bu harika, teşekkürler. Test etmek isterim, fakat mesajın dışında herhangi bir veri (bazı php kullanırken) yazdırmaz. Böyle olması bekleniyor mu? – kenorb

+0

Muhtemelen hayır. Sessiz seçeneği olmadan çalıştırmayı deneyin ve kaç probun aktif hale geldiğini görün.Ben DTrace ile PHP (çoğunlukla C/C++/Fortran/Perl) çalıştırmayın, belki bu sağlayıcı alışkınım biraz tuhaflıklar vardır. –