Menampilkan nomor baris di Stack Trace untuk perakitan .NET dalam mode Rilis

140

Apakah ada cara untuk menampilkan garis dalam pelacakan tumpukan untuk perakitan NET. Membangun / digunakan dalam mode Rilis?

MEMPERBARUI:

Aplikasi saya dibagi menjadi tiga proyek perpustakaan kelas dan satu proyek "situs" ASP.NET. Kesalahan yang saya coba lacak ada di salah satu dari tiga proyek perpustakaan kelas. Saya hanya menyebarkan file pdb untuk proyek perpustakaan kelas yang menghasilkan kesalahan "Referensi objek tidak disetel ke contoh objek".

Nomor baris masih belum muncul di pelacakan tumpukan. Apakah saya perlu menerapkan file pdb untuk semua proyek untuk mendapatkan nomor baris di pelacakan tumpukan?

Solusi kerja

Menerapkan file pdb untuk setiap aplikasi memperbaiki masalah nomor baris.

Michael Kniskern
sumber

Jawaban:

147
  • Masuk ke jendela Properties untuk proyek di mana Anda ingin melihat nomor baris pelacakan tumpukan.
  • Klik pada Build "tab vertikal".
  • Pilih konfigurasi "Rilis". Periksa parameter konstanta DEBUG.
  • Hapus centang pada parameter "Optimalkan kode" untuk menghindari masalah pelacakan sesekali dengan kode sebaris (langkah ini tidak penting).
  • Tekan tombol Advanced ... dan pilih Output -> Debug Info -> pdb-only.
  • Terapkan file .pdb yang dihasilkan dengan perakitan.

Diimplementasikan dengan komentar di bawah ini:

  • Satu hal lagi yang perlu diperiksa adalah di bagian "Paket / Publikasikan Web" bahwa kotak centang "Kecualikan simbol debug yang dihasilkan" juga tidak dicentang
Kurang ajar
sumber
2
Apakah saya harus menerapkan file pdb bersama dengan assembly?
Michael Kniskern
7
Iya. Di situlah simbol debug dan nomor baris berada.
John Saunders
5
Anda mungkin tidak ingin mengungkapkan informasi ini jika Anda tidak perlu melakukannya. Gunakan untuk men-debug masalah klien, ya. Tetapi Anda tidak selalu ingin melakukannya karena informasi debug dapat memberikan data sensitif dan menjadi vektor serangan. Bergantung pada apa aplikasi Anda.
i_am_jorf
6
@ Carlo: Informasi debug juga berfungsi dengan kode rilis (dioptimalkan), namun debugging agak terbatas ( stackoverflow.com/questions/113866 ). Namun callstack cukup andal bahkan dalam kode yang dioptimalkan, dengan pengecualian fungsi inline dan situasi sesekali di mana tail call bisa hilang karena urutan panggilan xxx / ret diganti dengan jmp xxx.
Suma
12
Satu hal lagi yang perlu diperiksa adalah di bagian "Paket / Publikasikan Web" bahwa kotak centang "Kecualikan simbol debug yang dihasilkan" juga tidak dicentang
Gaz
17

Di VS2012 Anda juga perlu menghapus centang "Kecualikan simbol debug yang dihasilkan" di bagian Paket / Publikasikan Web di properti.

pengguna3250653
sumber
atau jika ini adalah aplikasi desktop, pastikan file PDB diterapkan
CAD bloke
9

Saya pernah mengalami masalah di masa lalu di mana saya merasa perlu untuk menyebarkan file PDB dengan rilis build untuk melacak kesalahan. Alasannya adalah, seperti yang Anda katakan, adalah bahwa pengecualian terjadi dalam metode yang sangat besar dan saya tidak dapat menunjukkan dengan tepat di mana itu terjadi.

Ini mungkin merupakan indikasi bahwa metode tersebut perlu difaktorkan ulang menjadi metode yang lebih kecil dan lebih terperinci. Tidak satu ukuran cocok untuk semua jawaban, tetapi pendekatan ini telah membantu saya dalam jangka pendek (saya sering menemukan bug selama refactoring) dan dalam jangka panjang.

Hanya pemikiran saja.

kehidupan kotor
sumber
Ini. Dan saat Anda pergi, coba lempar tangkapan di tempat yang lebih samar dengan butiran yang lebih halus. Dan tingkatkan penjaga di awal fungsi ini jika asumsi harus dibuat.
Gerard ONeill
Sering dikatakan dan memang benar, bagaimanapun, ada warisan, ada programmer menulis metode besar baru, dan terkadang metode besar sebenarnya adalah hal terbaik untuk dilakukan (membaginya membingungkan atau YAGNI). Plus, bahkan untuk metode 5 baris - Anda mempersempit pencarian Anda 5x - jadi PDB adalah hal yang dibutuhkan dalam produksi kecuali Anda
bersusah payah
3

Sertakan simbol debug dengan paket build / deployment Anda.

Ken Browning
sumber
0

Di VS 2008 Express, saya menemukannya di bawah Project Properties -> Compile -> Advanced Compile Options.

Darel
sumber
1
Apa yang kamu temukan? Anda bisa memposting komentar jika Anda tidak ingin memposting jawaban lengkap.
jumxozizi
-4

Ini bekerja setiap saat. Anda hanya perlu membuat substring pesan pelacakan tumpukan. Sangat Mudah! Juga, di vb.net Anda perlu melakukan "Show All Files" dan memasukkan pdb.

'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

Versi C #:

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++;
}
Tim Perry
sumber