Sürüm modunda .NET derlemesi için Yığın İzinde satır sayısını görüntüleme


139

Release modunda dağıtılan .NET derlemesi için yığın izlemesindeki satırları görüntülemenin bir yolu var mı?

GÜNCELLEME:

Uygulamam üç sınıf kütüphane projesi ve bir ASP.NET "web sitesi" projesine ayrılmıştır. İzlemeye çalıştığım hata, üç sınıf kütüphane projesinden birinde. Ben sadece "Nesne başvurusu bir nesnenin örneğine ayarlanmadı" hatası üreten sınıf kitaplığı projesi için pdb dosyasını dağıttı.

Satır numaraları yığın izlemede görünmüyor. Yığın izlemedeki satır numaralarını almak için tüm projeler için pdb dosyalarını dağıtmam gerekir mi?

Çalışma çözümü

Her uygulama için pdb dosyasını dağıtmak satır numarası sorununu çözdü.

Yanıtlar:


147
  • Yığın izleme satırı numaralarını görmek istediğiniz proje için Özellikler penceresine gidin.
  • "Dikey sekmeyi oluştur" u tıklayın.
  • "Release" yapılandırmasını seçin. DEBUG sabit parametresini kontrol edin.
  • Sıralı kodla arada sırada izleme sorununu önlemek için "Kodu optimize et" parametresinin işaretini kaldırın (bu adım gerekli değildir).
  • Gelişmiş ... düğmesine basın ve Çıktı -> Hata Ayıklama Bilgisi -> yalnızca pdb'yi seçin.
  • Oluşturulan .pdb dosyasını derleme ile dağıtın.

Aşağıdaki yorum ile uygulandı:

  • Kontrol edilmesi gereken bir diğer şey de "Oluşturulan hata ayıklama sembollerini hariç tut" onay kutusunun işaretlenmediği "Web'i Paketle / Yayınla" bölümünde

2
Derleme ile birlikte pdb dosyasını dağıtmak zorunda mıyım?
Michael Kniskern

7
Evet. Hata ayıklama sembolleri ve satır numaraları buradadır.
John Saunders

5
Gerekmiyorsa muhtemelen bu bilgileri ifşa etmek istemezsiniz. Bir istemcinin sorununu ayıklamak için kullanın, evet. Ancak bunu her zaman yapmak istemezsiniz, çünkü hata ayıklama bilgileri hassas verileri verebilir ve bir saldırı vektörü olabilir. Uygulamanızın ne olduğuna bağlı olarak.
i_am_jorf

6
@Carlo: Hata ayıklama bilgileri sürüm (optimize edilmiş) koduyla da çalışır, ancak hata ayıklama biraz sınırlıdır ( stackoverflow.com/questions/113866 ). Ancak calltacks, optimize edilmiş kodda bile oldukça güvenilirdir, çünkü sıralı fonksiyonlar ve çağrı xxx / ret dizisi jmp xxx ile değiştirildiği için kuyruk çağrısının eksik olabileceği durumlar.
Suma

12
Kontrol edilmesi gereken bir diğer şey de "Oluşturulan Hata Ayıklama Sembollerini Hariç Tut" onay kutusunun işaretli olmadığı "Paketle / Yayınla" bölümünde
Gaz

17

VS2012'de, özelliklerin Paket / Yayınlama Web bölümündeki "Oluşturulan hata ayıklama sembollerini hariç tut" seçeneğinin işaretini kaldırmanız gerekir.


veya bir masaüstü uygulamasıysa, PDB dosyasının dağıtıldığından emin olun
CAD bloke


9

Geçmişte bir hatayı izlemek için PDB dosyalarını bir sürüm derlemesi ile dağıtma ihtiyacını hissettiğim sorunlarla karşılaştım. Bunun nedeni, dediğin gibi, istisnanın çok büyük bir yöntemde meydana gelmesi ve gerçekleştiği yeri tam olarak tespit edemememdi.

Bu, yöntemin daha küçük, daha ayrıntılı yöntemlere yeniden düzenlenmesi gerektiğinin bir göstergesi olabilir. Tek bir boyut tüm cevaplara uymuyor, ancak bu yaklaşım kısa vadede bana iyi hizmet etti (sık sık yeniden düzenleme sırasında hatayı buldum) ve uzun vadede.

Sadece bir düşünce.


Bu. Ve gittikçe, daha ince bir tahılda daha kabataslak yerlerde yakalamaları deneyin. Ve varsayımlar yapılması gerekiyorsa, bu işlevlerin başında korumaları artırın.
Gerard ONeill

Sıklıkla söylenen ve çok doğru, ancak, miras var, yeni büyük yöntemler yazan programcılar var ve bazen büyük bir yöntem aslında en iyi şeydir (bölmek kafa karıştırıcı veya YAGNI). Ayrıca, 5 satırlı bir yöntem için bile - aramanızı 5x
daraltmış olursunuz


0

VS 2008 Express'te, Proje Özellikleri -> Derle -> Gelişmiş Derleme Seçenekleri altında buldum.


1
Ne buldun? Eksiksiz bir yanıt göndermek istemiyorsanız yorum gönderebilirsiniz.
jumxozizi

-4

Bu her seferinde işe yarar. Yığın izleme iletisini yalnızca alt dize yapmanız yeterlidir. Gerçekten Kolay! Ayrıca, vb.net içinde "Tüm Dosyaları Göster" ve pdb dahil yapmanız gerekir.

'Err is the exception passed to this function

Dim lineGrab As String = err.StackTrace.Substring(err.StackTrace.Length - 5)
Dim i As Integer = 0
While i < lineGrab.Length                   
    If (IsNumeric(lineGrab(i))) Then
        lineNo.Append(lineGrab(i))
    End If
    i += 1
End While

'LineNo holds the number as a string

C # sürümü:

string lineGrab = error.StackTrace.Substring(error.StackTrace.Length - 5);

int i = 0;
int value;
while (i < lineGrab.Length)
{
    if (int.TryParse(lineGrab[i].ToString(), out value))
    {
        strLineNo.Append(lineGrab[i]);
    }
    i++;
}
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.