Debug Okuma ve Yorumlama


Bilgisayarda oluşan hatalara bug, derleyici programın arka planında çalışarak yazılan kodlar arasındaki hataları bulmaya debugger ve bu hataları çözme işlemine de debug denir. Bug terimi 1940'lı yıllarda ortaya çıkmıştır. Bir böceğin, bir hesaplama askeri bilgisayarın devrelerinin yanmasına sebebiyet vermesinden almıştır. Yazılımsal kodlama ve sistem hatalarına da böylelikle 'bug' denilmeye başlanmıştır.

Peki o zaman sistemde gelen bug'ları nasıl anlar ve yorumlarız.Bu bug bir syntax error,runtime error,yanlış işlevi çağırma veya yanlış yerde yanlış değişkenleri kullanma vs örnek verilebilinir.Kodunuzdaki sorunları düzeltmek bazen çok zor olabilir. Karşılaştığınız sorun bir hataysa, sorunun dosyasını ve satır numarasını zaten bildiğiniz için düzeltilmesi oldukça kolaydır. Bazen sorun, uygulamanın yapmasını beklediğiniz şeyi yapmamasıdır ve çoğu zaman bu sorunu çözmek çok daha zordur.

cftrace ve cfdump

cftrace tagı, kodunuzun herhangi bir yerine, istediğiniz sayıda yerleştirilebilir.Değişken,fonksiyon işlevselliğinin izlemeye yarar.

<cftrace var="form" inline="yes" text="initial form tag"> --> form sayfanızda hangi form değişkenlerinin geçirildiğini gösterir.

Bir sorunun hata ayıklamasına yardımcı olan başka bir yöntem de cfdump etiketini kullanmaktır. Cfdump etiketi, basit bir değer olmayan değişkenler dahil olmak üzere herhangi bir değişkeni çıktılar.

<cfdump var="#session#"> --> session değerlerini ekrana döker.

Javascript hata ayıklama


Bu hataları ayıklamak kolay değildir.Ancak tüm tarayıcılarda javascript hata ayıklayıcısı mevcuttur.Tarayıcı hata ayıklayıcısını kullanarak her satıra kod izleme noktası(breakpoints) ekleyerek kodu adım adım izleyebiliriz.Hata ayıklama penceresi tüm modern tarayıcılarda F12 tuşu kullanılarak ulaşabiliriz.Javascript hatası ise console düşer.Aşağıda console düşen bi hata ekran örneğidir.

Başka bir hata yakalama yöntemi ise cfcatch dosyasına (C klasörü dizini altında) düşen hatadır.Buraya düşen hatalar genelde sayfanın sürekli yükleniyor olarak kalması durumunda görülür.Aşağıda cfcatch e düşen hata ekranıdır.Hata sebebi,hangi dosyada olduğu satır numarası ile vermektedir.Hataya ulaşmak gibi hatayı yorumlamakta önemlidir.Örneğin aşağıda verilen hata ekranında date parametresinin çağrılan sayfada boş olarak gitmesidir.Bu durum bir değeri boş olarak göndermek istediğimde koşullar ile kontrol eklenmesi gerekir.

Örnek Kullanım:

<cfif isdefined('attributes.date') and len(attributes.date)> #attributes.date#" </cfif>

Örnek Debug Okumaları


is undefined
Tanımlanmamış alan veya veri anlamına gelir. Çoğunlukla tanım eksikliklerinden kaynaklanır.

Örnek: Element EXPENSE_ITEM_ID is undefined in CATEGORY
Yorum: CATEGORY query içinde verilen alanın olmaması veya var olup değerin boş olması
Çözüm:  hatanın oluştuğu sayfanın belirtilen querysin de alanın select ile çekilmesinden emin olmak veyahut varsa eğer bu alanın kullanıldığı yerde <cfif isdefined("category.expense_item_id") and len(category.expense_item_id)>  <!--- işlem ----> </cfif> kontrol sağlamak


Invalid column name
Veri tabanında sorgunun istediği kolonun olmaması anlamına gelir.
Örnek: Invalıd column name DIRECT_EXPENSE_CODE
Yorum: DIRECT_EXPENSE_CODE kolonu kullanılan tabloda yok. Veri tabanı ile kod arasında fark var demektir.
Çözüm: ilgili tabloda alanın açılması veya ilgili WRO'nun çalıştırılması.


Could not find
Kod parçacağı içinde ihtiyaç duyulan adreslenmiş dosyanın bulunamaması anlamına gelir.
Örnek: Could not find the included template ../v16/e_government/query/netbook_status.cfm.
Yorum: Kullanılan uygulamada kodda belirtilen dosya yok eksik kod. 
Çözüm: ../v16/e_government/query/ dizinin altına netbook_status.cfm dosyasını eklemek.


CFML structure referenced
Bu hatayla genellikle fuseaction yanlış olduğunda karşılaşılır
Örnek: undefined in a CFML structure referenced as part of an expression.
Yorum: Fuseaction eksiktir, modül yoktur. 
Çözüm: 

  1. Modül adı ve sayfa adı bir nokta ile bağlanarak fuseaction'ı oluşturur : modul_adi.sayfa_adi Fuseaction yanlış gönderilmişse tıkladığınız bağlantı kodunu düzenlemeyi deneyebilirsiniz.
  2. Eğer fuseaction değerinizin doğru olduğunu düşünüyorsanız DevTools > Wo içerisinden sisteminizde mevcut olup olmadığını ve doğruluğunu kabul edebilirsiniz.

for CFSQLTYPE CF_SQL_INTEGER.?
Bu hata genellikle zorunlu form - url parametreleri gönderilmediğinde ya da hatalı veri tipi gönderildiğinde oluşur.Sorgu oluşturulurken parametre değeri ve tipini atamak için cfqueryparam etiketi kullanılır.cfqueryparam etiketinde value parametresi cfsqltype parametresinde tanımlanan veri tipinde değilse bu hatayla karşılaşılır.Örneğin value = 'wrk' cfsqltype = 'cf_sql_integer' : Bu durumda hatalı veri tipi gönderildiğinden hatalı veri tipi hatasıyla karşılaşırsınız.
Örnek: for CFSQLTYPE CF_SQL_INTEGER
Yorum: Kullanılan uygulamada kodda belirtilen dosya yok eksik kod. 
Çözüm: 

  1. Url'den ya da formdan eksik - hatalı veri gönderilip gönderilmediğini kontrol edin!
  2. Sorgu içerisinde parametre ataması yaparken; hata veren satırda, cfqueryparam etiketinde, value parametresinin cfsqltype parametresinde istenilen tipte gönderildiğinden emin olun.
  3. Muhtemelen integer ya da float tipte veri tipi istenirken, değer string tipinde gönderilmiştir!

socket write error?

  1. Bu hata veritabanı bağlantısının yapılamadığı durumlarda oluşur.
  2. Ağınızda veritabanı erişimini engelleyen güvenlik duvarı ya da VPN olabilir.
  3. Uygulama sunucunuzda CF datasource tanımlarınız hatalı ya da kullanıcı bilgileri değişmiş olabilir.
  4. Veritabanı sunucunuz kapalı olabilir ya da isteklere cevap vermiyordur

Örnek: Your connection was terminated' or errorMessage contains 'Connection reset by peer: socket write error
Yorum: Fuseaction eksiktir, modül yoktur. 
Çözüm: 

  1. Veritabanına erişiminizi engelleyebilecek VPN varsa devre dışı bırakın. 
  2. Güvenlik duvarı ayarlarınızı kontrol edin.Uygulama sunucunuzda CF Datasource bilgilerinizin doğru olduğundan emin olun.
  3. Veritabanı sunucunuzun açık olduğunu doğrulayın, isteklere yanıt verip vermediğini test edin.

An exception occurred when setting up mail server parameters.
Yorum: mail gönderme de oluşan hatadır.Sunucu taraflı kontrol sağlanmalıdır.
Çözüm: 

  1. yeni getirilen güvenlik duvarı kısıtlamaları ve benzeri kontrol edilmeli.
  2. cf mail sunucusunun  IP'sinin yakın zamanda değişip değişmediğini kontrol edilmeli(cf admin panel-server settings-mail>>Mail Server)
  3. Coldfusion Sunucusunun yeniden başlatılması(restart)

Ambiguous name column 'CATEGORY_ID'
Yorum:  Sorgunuzun içinde join yapılan tablolarda en az iki tablo arasında aynı isimle sunulan bir kolon isminin olmasıdır. Bu kolon ismi yukarıda CATEGORY_ID değeridir

  1. Bu durumda hangi tablodan sütunu seçeceğimizi belirtmemiz gerekir.
  2. Yani bu kolon değerinin Categories tablosundan mı Products tablosundan vb. mı çekileceğine karar vermeniz gerekli.

Örnek Kullanım:

     SELECT P.CategoryID FROM Products P  INNER JOIN Categories C ON C.CategoryID = P.CategoryID; 


The multi-part identifier "P.PRODUCT_ID" could not be bound.

  1. Buradaki hata p nin tanımlanmamış olması.

Örnek Kullanım:

hatalı.

SELECT * FROM Company c INNER JOIN Products AS  ON c.CompanyID = P.PRODUCT_ID

olması gereken.

SELECT * FROM Company c INNER JOIN Products AS p ON c.CompanyID = P.PRODUCT_ID



Invalid object name/INFORMATION_SCHEMA.tables
Yorum: Sorgu Yapacağınız “DATABASE” seçmemişsiniz demektir.

  1. Bunu manuel Management Tool da çalıştırırken  sol köşesinde master seçili olan kısımda sorguyu çektiğiniz DB ismi yazılmalıdır.
  2. Kodda yazdığınız query de schema,db ismi belirtilmelidir. dbadi.tabloadi şeklinde yazılmalıdır.

Örnek Kullanım:

 Workcube 1 DB ve 4 schema ile gelir.

  • Main Schema -DSN
  • Product Schema - DSN1
  • Company Schema - DSN3
  • Period Schema - DSN2

    <cfquery name="GET_GEN_PAPER" datasource="#DSN3#"> <!---böylelikle hangi database bağlanacağını belirtiyoruz --->

        SELECT * FROM GENERAL_PAPERS WHERE PAPER_TYPE IS NULL

    </cfquery>

Diyelimki birden fazla tablo ile işlem yapacağız ve farklı database lerde çekiliyor bu durumda yapılması gereken:

<cfquery name="det_demand" datasource = "#dsn2#">

     SELECT    

        BTD.DEMAND_EMP_ID

    FROM

        BUDGET_TRANSFER_DEMAND BTD 

        LEFT JOIN #dsn#.BUDGET B ON B.BUDGET_ID = BTD.BUDGET_ID 

    WHERE 

        BTD.DEMAND_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.DEMAND_ID#">

</cfquery>


String or binary data would be truncated. The statement has been terminated

Yorum:  Bu hatanın anlamı veri tabanında belirtmiş olduğunuz alanın sınırı aşıldı demektir.Query içerisindeki alanlardan birinin column size ı az gelmiş anlamına gelir

  1. veritabanında ilgili kolonun karakter sayısını arttırmak
  2. adsoyad alanınızın türü nvarchar(50) ve karakter sınırlaması olarak ta 50 karakter olarak tanımlandığını varsayalım.50 Karakterden fazla değer girilince hata verir ve belirtilen kolona nvarchar(100) olarak arrtırılabilir

>> CFML Hatalarının Sınıflandırılması İle ilgili Adobe dokumanı okumak için tıklayın.

Geri Bildirim

Bu içeriği faydalı buldunuz mu?
İlişkili İçerikler