Geçerli Yığın İzi herhangi bir istisna olmadan .NET'te nasıl yazdırılır?


350

Düzenli bir C # kodum var. İstisnalarım yok . Hata ayıklama amacıyla geçerli yığın izlemesini programlı olarak günlüğe kaydetmek istiyorum. Misal:

public void executeMethod() 
{
    logStackTrace();
    method();
}

Yanıtlar:


401

İsim alanına bir göz atın System.Diagnostics. Orada güzellikler bir sürü!

System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();

Bu, kaputun altında neler olup bittiğini öğrenmek için etrafta bir şaka yapmak için gerçekten iyi.

Amacınıza ve daha sonra bazılarına ulaşabilecek günlük çözümlerine (NLog, log4net veya Microsoft kalıpları ve uygulamaları Enterprise Library gibi) göz atmanızı öneririm. İyi şanslar dostum!


74
Unutmayın StackTraceolduğunu yavaş köpek yüzden idareli kullanmak -.
Jonathan Dickinson

214

Buna bir alternatif System.Environment.StackTraceSystem.Diagnostics.StackTrace kullanmaktır yığın izinin dize olarak temsilini döndüren .

Başka bir kullanışlı seçenek, uygulama yeniden oluşturulmadan çalışma zamanı etkinleştirilebildiğinden , Visual Studio'da$CALLER ve $CALLSTACK hata ayıklama değişkenlerini kullanmaktır.


6
Environment.StackTracesadece yeni bir örnek StackTrace.
Daniel

9
@Daniel: Evet, ancak System.Environment.StackTracebu bilgilere erişmenin daha kolay bir yolu olabilir.
larsmoa

6
@AndreiRinea: Aslında kullandığınız hat numaralarını erişebilirler inanıyoruz System.Diagnostics.StackTrace- bkz msdn.microsoft.com/en-us/library/...
larsmoa

5
Her Environment.StackTracezaman ile başlayan rahatsız edici değil at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace()mi? Bu, birinin istediği noktada olduğu gibi mevcut yığın izinin bir parçası değildir.
Rory

7
@Rory, yapıcı StackTrace bir göz atın (int skipFrames, bool fNeedFileInfo), başlangıç ​​karesini atlayabilirsiniz. ILSpy yönteminde ipen ve ne yaptığını görebilirsiniz
Walter Vehoeven

39

Bunu yapmanın iki yolu vardır. Bu System.Diagnostics.StackTrace(), geçerli iş parçacığı için bir yığın izlemesi verir. Bir Threadörneğe başvurunuz varsa bunun için yığın izlemesini aşırı yüklenmiş sürümü aracılığıyla alabilirsiniz StackTrace().

Ayrıca Yığın Taşması sorusunu da kontrol etmek isteyebilirsiniz. Güncel olmayan iş parçacığının yığın izini nasıl alabilirim? .


16

Bunu kodu değiştirmeden Visual Studio hata ayıklayıcısında da yapabilirsiniz.

  1. Yığın izini görmek istediğiniz yerde bir kesme noktası oluşturun.
  2. Kesme noktasını sağ tıklatın ve VS2015'te "Eylemler ..." seçeneğini belirleyin. VS2010'da "Vurulduğunda ..." seçeneğini belirleyin, ardından "Mesaj yazdır" ı etkinleştirin.
  3. "Yürütmeye devam et" seçeneğinin seçili olduğundan emin olun.
  4. Yazdırmak istediğiniz metni yazın.
  5. Yığın izini görmek istediğiniz yere $ CALLSTACK ekleyin.
  6. Programı hata ayıklayıcıda çalıştırın.

Elbette, kodu farklı bir makinede çalıştırıyorsanız bu yardımcı olmaz, ancak yayın kodunu etkilemeden veya programı yeniden başlatmaya gerek kalmadan otomatik olarak bir yığın izlemesi tükürmek oldukça kullanışlı olabilir.


7
Bir yığın izlemesi görmek istiyorsanız ve zaten bir kesme noktasında VS hata ayıklayıcısındaysanız, Debug-> Windows-> Call Stack'e gidin.
khargoosh

5
Evet, ancak bu şekilde yaparsanız, yığın izini görmek için programın durması gerekmez.
Hank Schultz

7
Console.WriteLine(
    new System.Diagnostics.StackTrace().ToString()
    );

Çıktı şuna benzer olacaktır:

at YourNamespace.Program.executeMethod (Dize msg)

at YourNamespace.Program.Main (String [] argümanlar)

Değiştir Console.WriteLinesizin ile Logyöntemle. Aslında, .ToString()kabul ettiği gibi Console.WriteLine durumuna gerek yoktur object. Ancak Log (string msg) yönteminiz için buna ihtiyacınız olabilir.


-2
   private void ExceptionTest()
    {
        try
        {
            int j = 0;
            int i = 5;
            i = 1 / j;
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
            var stList = ex.StackTrace.ToString().Split('\\');
            Console.WriteLine("Exception occurred at " + stList[stList.Count() - 1]);
        }
    }

Benim için iş gibi görünüyor


3
Bu sadece açık bir istisna oluşturuyor. Neden? Neden kendi içinde bir istisna yaratacak bir kusurdan ziyade açıkça bir istisnayı somutlaştırmıyorsunuz? Gerçek istisnayı elde etmek için gereken ek yakalama mantığının yararı nedir? Ve o zaman bile, istisnasız bir yığın izlemesinin nasıl alınacağıyla ilgili asıl gönderilen soruyu hala görmezden geliyorsunuz (başlığı okuyun).
flater

geçerli bir cevap, ama tanrı korkunç bir çözüm. HİÇBİRİ, nerede olursanız olun ... @Jeff KULLANMALI, önerilen diğer cevaplar gibi bir iniş koduyla değiştirin.
Tomer W
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.