C#'ta StackTrace ve StackFrame ile Tracing
StackTrace uygulamanın yaşam döngüsündeki belirli bir t anındaki aktif stack frame’lerin izlenebildiği bir tür rapor verisidir. Herbir stack frame ise çağrılmış ve henüz sonlanmamış olan bir fonksiyona ilişkin durum bilgisini (dosya, satır no vb) ifade eder. Geliştirici debug ve diagnostik amaçlarla bu bilgilere ulaşabilir. Özellikle iç içe fonksiyon çağırmalarında hata tespiti ve izleme açısından bu bilgi önemlidir.
Aykut TAŞDELEN
StackTrace’e programatik olarak erişimin kolay bir yolu C#’da Exception sınıfının StackTrace isimli sanal ve string türündeki property’sini kullanmaktır. Bu property basit olarak hatanın hangi fonksiyonda, hangi dosyada ve satır numarasında oluştuğunu verir. Örneğin :
string s = “C ve Sistem Programcıları Derneği”;
try
{
Console.WriteLine(s[50]);
}
catch (Exception e)
{
Console.WriteLine(e.StackTrace);
}
Kodunun çıktısı şöyledir :
at System.String.get_Chars(Int32 index)
at Stack_Trace_Ornegi.Main(String[] args) in C:\Stack_Tracing\Stack_Tracing\Program.cs:line 22
Şüphesiz bu property sanal olduğu için yazılan özgün bir Exception sınıfında override edilebilir.
Bir hata oluştuğunda daha detay bilgiler StackTrace ve StackFrame sınıflarıyla alınabilir. StackTrace sınıfının bool parametreli constructor’ına true sabiti geçilerek yaratılan nesneyle StackFrame’ler (nesneleri) elde edilip dosya, satır, fonksiyon gibi bilgilere ulaşılabilir. Constructor’a false geçilirse dosya ve satır bilgisi elde edilemez.
usingSystem;
usingSystem.Diagnostics;
class Stack_Trace_Ornegi
{
public static void Foo()
{
Bar();
}
public static void Bar()
{
ErrorSampleerr = newErrorSample();
err.GenerateError();
}
static void Main(string[] args)
{
try
{
Foo();
}
catch
{
}
}
classErrorSample
{
publicvoidGenerateError()
{
try
{
thrownewException(“Hata oluştu”);
}
catch(Exception e)
{
StackTracest = newStackTrace(true);
strings = “”;
intnum = 0;
for(int i = 0; i < st.FrameCount; i++) // 4 frame var
{
num = i + 1;
StackFramesf = st.GetFrame(i);
Console.WriteLine(“”);
Console.WriteLine(s + ” Metot: {0}”, sf.GetMethod());
Console.WriteLine(s + ” Dosya: {0}”, sf.GetFileName());
Console.WriteLine(s + ” Satır: {0}”, sf.GetFileLineNumber());
Console.WriteLine(s + ” Mesaj {0} : {1}”, num, e.Message);
s += “\t”;
}
throw e;
}
}
}
}

C ve Sistem Programcıları Derneği Eğitmeni
