php debug_backtrace fonksiyonu

dubug_backtrace

PHP’de debug_backtrace() fonksiyonu, çalıştırıldığı yere kadar çalışan tüm metodları, bunların argümanlarını kullanılan nesneleri classları, çalışan dosyanın tam yolunu vs bilgileri bize array olarak veren bir metoddur. Adı üzerinde, backtrace’leri debug ediyor 🙂

Örnek olarak hazırladığım 2 adet php sayfası var. Bunlardan biri default.php diğeri start.php. Biraz karmaşık gibi görünebilir, debug_backtrace fonksiyonunun ne işe yaradığını gösterebilmek için tünel kazarak fonkisyondan nesne yaratıp metodlara gittim

start.php içeriği şöyle;

< ?php
require_once 'default.php';

start("dubluve", "dubluve.net");

function start($param1, $param2){
		$default = new DefaultClass($param1);
		$default->deneme();
}
?>

Burada default.php sayfasını require_once ile aldık, daha sanra start(); fonksiyonunu çalıştırdık.
start(); fonksiyonu içerisinde ise DefualtClass için bir nesne yarattık, ardından da deneme(); metodunu çalıştırdık.

default.php içeriği şöyle;

< ?php
class DefaultClass{

	protected $_var = "a";
	private $_var2 = "b";
	public $value = "c";
	
	public function __construct($param){

	}

	public function deneme(){
		$this->_defaultDebug($this->_var);

	}

	protected function _defaultDebug(){
		$result = debug_backtrace();
		print_r($result);
	}

}
?>

Burada da DefaultClass clasımız var. Bu class için nesne yarattığımızda çalışan __construct metodu 1 adet parametre alıyor.
Ardından çalıştırdığımız deneme(); metodu ise protected olan _defaultDebug(); metodunu çağırıyor. Burada da dubug_backtrace yapıyoruz.
Ayrıca DefaultClass classında 3 adet property var.

Şimdi bakalım bunun sonucuna;

Array
(
    [0] => Array
        (
            [file] => A:\deneme\default.php
            [line] => 13
            [function] => _defaultDebug
            [class] => DefaultClass
            [object] => DefaultClass Object
                (
                    [_var:protected] => a
                    [_var2:DefaultClass:private] => b
                    [value] => c
                )

            [type] => ->
            [args] => Array
                (
                    [0] => a
                )

        )

    [1] => Array
        (
            [file] => A:\deneme\start.php
            [line] => 8
            [function] => deneme
            [class] => DefaultClass
            [object] => DefaultClass Object
                (
                    [_var:protected] => a
                    [_var2:DefaultClass:private] => b
                    [value] => c
                )

            [type] => ->
            [args] => Array
                (
                )

        )

    [2] => Array
        (
            [file] => A:\deneme\start.php
            [line] => 4
            [function] => start
            [args] => Array
                (
                    [0] => dubluve
                    [1] => dubluve.net
                )

        )

)

Sonuç olarak dönen array içinde 3 adet array var, gelin bunları tek tek inceleyelim.

  • İlk arrayimiz, dubug_backtrace(); metodun içinde olduğu _defaultDebug metodunun çağırıldığı yer. yani deneme(); metodunun içerisi. [file] parametresinde bu metodu çağıran yerin tam yolu, [line] parametresinde ise o dosyada kaçıncı satırda çağırıldığı bilgisi var. [function] parametresinde de çağırılan metod var. Bu metodun içerisinde bulunduğu class [class] parametresinin içerisinde. [object] parametresi içerisinde de, nesnemiz ve bunun içerisindeki propertyler yer almakta. [arg] içerisinde de argümanlar mevcut.
  • İkinci arrayimizde ise, ilk arrayde çalışan metodun çağırıldığı yer var. yani deneme(); metodunun çağırıldığı yer. Biz deneme metodunu, start.php içerisinde bir nesne yaratarak çağırmıştık, diğer argümanlara baktığımızda bunu da görebiliyoruz.
  • Son arrayimizde ise start.php içerisinde çağırdığımız start(); fonksiyonu yer almakta, çünkü biz ilk oalrak bunu çağırdık. Burada argümanlarını da açıkca görebiliyoruz.

Gelen sonuçlarda [file] parametresindeki dosyanın tam yolunun, include işlemlerinde de işimize yarayabileceğini düşünüyorum.

debug_print_backtrace

debug_print_backtrace(); fonksyionu da debug_backtrace ile hemen hemen aynı işi yapmakta. Farkları, debug_backtrace kadar fazla detay vermemesi, ve geriye hiç birşey döndürmemesi. Geriye hiç birşey return etmiyor, sonucu direk ekrana basıyor.

Şöyle ki, yukarıda verdiğim örnekteki _defaultDebug(); metodu böyleyken;

protected function _defaultDebug(){
		$result = debug_backtrace();
		print_r($result);
	}

şu hale getirirseniz;

protected function _defaultDebug(){
		debug_print_backtrace();
	}

debug_print_backtrace metodunun verdiği sonucu da görmüş olursunuz. Verdiğim örnekte aşağıdaki sonucu aldım;

#0 DefaultClass->_defaultDebug() called at [A:\deneme\default.php:13]
#1 DefaultClass->deneme() called at [A:\deneme\start.php:8]
#2 start(dubluve, dubluve.net) called at [A:\deneme\start.php:4]

Görüldüğü üzere çalışan metodları ve nereden çağırıldıklarını listelemekte.

web hata ayıklama (debug) metodolojileri ve teknikleri

Herkes bir yerlerde elbet bir hata ile karşılaşmıştır.

Düşünsenize, o hatayı nasıl giderdiniz? Bir şekilde gidermişsinizdir değil mi?

Hata ayıklamanın da yöntemleri mevcut. Bunları, kendim tecrübe ettiğim kadarını (genelde web ile ilgili) sizlerle paylaşmak istiyorum. Bunlardan bazılarını mecbur yapacağız, bazılarını ise alternatifleri arasından tercih edip yapacağız.

Örnek Senaryo : Sitenizde bir kısmında hata meydana geldiği, bir tuşun işlevini yerine getirmediği belirtilmiş.

Mecburen siteye girip, hatayı kendimiz elde etmeye çalışırız. Bu çok önemlidir. Elde edemiyorsak, hatayı raporlayan kişiyle iletişime geçmemiz gerekiyor.
* Bir log yapısı ile bu hata loglanmış mı diye kontrol ederiz. hata loglanmış ise, logda yeterli bilgi muhtemelen vardır, buna göre aşağıdaki yöntemlere geçeriz.

Hata ayıklama için çalışma Şekilleri

  • Canlıda Çalışma : İnsan mecburda kalınca bazen canlıda çalışması gerekebiliyor diyebilirsiniz. Ancak benim bu konudaki tavrım net, canlıda bir şey çalışacak hale getirmeyin kendinizi. Yine de çalışmanız gerekiyorsa bu noktada, Sitenin hizmetini $_SERVER[“REMOTE_ADDR”] yardımıyla sizin IP niz dışındakilere kapatınız. Sizin IP’niz dışındakilere güncelleme çalışması yapıldığını belirtiniz.
  • Test ortamında çalışma : Gerçek Projenin aynısını kendi bilgisayarınıza veya test ortamınıza aktararak hatayı orada elde edip, düzeltmeye başlayın.
  1. Yayını Durdurun : Eğer hatanın nüksetmesi kritik önem arz ediyorsa, yayını ivedilikle durdurun. Ziyaretçilere bakım çalışması bilgisi verin. Bu müşterilerinize veya ziyaretçilerinize sizin hatadan haberdar olduğunuzu ve üzerinde çalıştığınızı göstererek, size çalışmak için zaman sağlayacaktır.
  2. Mevcut durumu Garanti altına alın : Hem dosyaları hem de veritabanını daha kötü bir senaryo için yedek alın. Yedek aldığınız veriler, önceki yedeklerin üzerine yazmamasına özen gösterin. Sıkışırsanız, veya daha kötü bir senaryo oluşursa en son state’e (hatanın oluştuğu ilk noktaya) geri döneceksiniz.
  3. Hata mesajlarını artırın , kapalıysa açın : Php hata mesajlarını ve Loglama hizmetlerini yazılım katmanından artırabiliyorsanız artırın. Kapalıysa açın.
  4. Sistemi kurtarmayı aşamalandırın : Hatayı tespit ettikten sonra ne yapacağınızı düşünmeniz gerekir. Madde madde bunları çıkarın. Mümkünse her maddeden sonra yedek alıp, durumu garanti altına alın.
  5. Yazılım hizmetlerini durdurun : Örneğin, yazılımınızda bir mail atma servii var. Siz hatayı tespit ederken sistem herkese mail atıyor olabilir. Bunun önüne geçmek için bu tarz hizmetleri durdurun veya sadece kendinizi ilgilendirecek şekilde düzenleyin.
  6. Log ekleyin : Hatayı tespit etmek için loglama yapın, varsa eğer, loglanan veri miktarını artırıp, logu detaylandırın.
  7. Çözümü Uygulayın : Bazı hatalar barizdir. Bazı hatalar ise bazen oluşur ki en beter hatalar bu şekilde ara-sıra oluşan hatalardır. Çözümü uygulayıp durum değerlendirmesi yapın.
  8. Sorunun çözüldüğünü Teyid edip, siteyi ayağa kaldırın : Artık işlemler bittiğinde, hatanın tekrar oluşmaması için tedbirinizi de alın. Ve siteyi tekrar yayına alın.
  9. Fazladan almış olduğunuz yedekler ile ilgilenin. (Dilerseniz silin, dilerseniz bir kaç gün sonra silmek üzere bir cronjob oluşturun)