Haruskah saya mengompilasi rilis build dengan info debug sebagai "penuh" atau "khusus pdb"?

114

Dalam Visual Studio 2010 untuk proyek C #, jika Anda masuk ke Project Properties> Build> Advanced> Debug Info Anda memiliki tiga opsi: tidak ada, penuh, atau hanya pdb. Berdasarkan jawaban atas pertanyaan ini , saya yakin saya memahami beberapa perbedaan antara full dan pdb-only. Namun, mana yang lebih sesuai untuk build rilis? Jika saya menggunakan "penuh" apakah akan ada konsekuensi kinerja? Jika saya menggunakan "pdb-only", apakah akan lebih sulit untuk men-debug masalah produksi?

Apa perbedaan antara "full" dan "pdbonly"? https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/debug-compiler-option

RationalGeek
sumber
Pdb-only atau none, selalu untuk build rilis.
leppie
13
@leppie Terima kasih, tetapi saya mencari beberapa pembenaran untuk posisi itu.
RationalGeek
Pertanyaan terkait: stackoverflow.com/questions/1270986/…
janv8000
Itu bagus jika tidak ada dampak kinerja. Bagaimana dengan dampak memori? Jika saya membuat turunan StackTrace dan meminta informasi file, itu harus berasal dari data simbol pdb. Apakah semua simbol dimuat ke dalam memori saat aplikasi dimulai? Berapa perkiraan penggunaan memori ini? (mis. persentase overhead relatif terhadap ukuran kode.)
yoyo

Jawaban:

90

Saya akan membangun dengan pdb-only. Anda tidak akan dapat melampirkan debugger ke produk yang dirilis, tetapi jika Anda mengalami crash dump, Anda dapat menggunakan Visual Studio atau WinDBG untuk memeriksa jejak tumpukan dan dump memori pada saat crash.

Jika Anda fullmemilih daripada pdb-only, Anda akan mendapatkan manfaat yang sama, kecuali bahwa executable dapat dilampirkan langsung ke debugger. Anda harus menentukan apakah ini masuk akal mengingat produk & pelanggan Anda.

Pastikan untuk menyimpan file PDB di suatu tempat sehingga Anda dapat mereferensikannya saat laporan kerusakan masuk. Jika Anda dapat menyiapkan server simbol untuk menyimpan simbol debugging tersebut, itu jauh lebih baik.

Jika Anda memilih untuk membangun dengan none, Anda tidak akan memiliki jalan lain saat terjadi crash di lapangan. Anda tidak akan bisa melakukan pemeriksaan setelah kejadian kecelakaan itu, yang bisa sangat menghambat kemampuan Anda untuk melacak masalahnya.

Catatan tentang kinerja:

Baik John Robbins dan Eric Lippert telah menulis entri blog tentang /debugbendera tersebut, dan keduanya menunjukkan bahwa setelan ini tidak memiliki pengaruh kinerja apa pun . Ada tanda terpisah /optimizeyang menentukan apakah kompilator harus melakukan pengoptimalan.

Matt Dillard
sumber
7
@Matt, artikel MSDN di sakelar / debug secara eksplisit memperingatkan tentang dampak kinerja menggunakan pengaturan 'penuh':If you use /debug:full, be aware that there is some impact on the speed and size of JIT optimized code and a small impact on code quality with /debug:full. We recommend /debug:pdbonly or no PDB for generating release code.
Allon Guralnek
3
@Matt: Jika 'full' tidak memiliki kekurangan dibandingkan dengan 'pdb-only', tetapi hanya memiliki kelebihan, mengapa 'pdb-only' bahkan ada? Apakah ada alasan untuk menggunakannya secara 'penuh'? Selain itu, Anda harus menambahkan koreksi ke artikel MSDN di bagian 'Konten Komunitas'.
Allon Guralnek
9
Kutipan @AllonGuralnek dari artikel terkait John Robbins: Alasan sebenarnya: sejarah. Kembali ke .NET 1.0 ada perbedaan, tetapi di .NET 2.0 tidak ada. Sepertinya .NET 4.0 akan mengikuti pola yang sama. Setelah memeriksa ulang dengan Tim Debugging CLR, tidak ada perbedaan sama sekali.
bentayloruk
5
Ini tidak benar. Anda dapat membuat hanya dengan pdb dan tetap memasang debugger. Saya hanya melakukannya untuk memastikan.
Tandai
2
"Saya akan membangun hanya dengan pdb. Anda tidak akan dapat memasang debugger ke produk yang dirilis" Apa sumber informasi Anda di sini? Seperti yang telah saya dan @Mark catat, ini tampaknya tidak benar.
MEMark
66

PERINGATAN Dokumentasi MSDN untuk / debug switch (Di Visual Studio ini adalah Debug Info) tampaknya kedaluwarsa! Inilah yang dimilikinya yang salah

Jika Anda menggunakan / debug: full , perhatikan bahwa ada beberapa dampak pada kecepatan dan ukuran kode yang dioptimalkan JIT dan sedikit pengaruh pada kualitas kode dengan / debug: full . Kami merekomendasikan / debug: pdbonly atau tidak PDB untuk menghasilkan kode rilis.

Satu perbedaan antara / debug: pdbonly dan / debug: full adalah bahwa dengan / debug: full kompilator memancarkan a DebuggableAttribute, yang digunakan untuk memberi tahu compiler JIT bahwa informasi debug tersedia.

Lalu, apa yang benar sekarang?

  1. Pdb-only - Sebelum .NET 2.0, ini membantu menyelidiki crash dumps dari produk yang dirilis (mesin pelanggan). Tapi itu tidak membiarkan melampirkan debugger. Ini tidak terjadi pada .NET 2.0. ini persis sama dengan Full .
  2. Penuh - Ini membantu kami menyelidiki dump error, dan juga memungkinkan kami memasang debugger untuk merilis build. Tapi tidak seperti yang disebutkan MSDN, itu tidak mempengaruhi kinerja (sejak .NET 2.0). Ini persis sama dengan Pdb saja .

Jika keduanya sama persis, mengapa kita memiliki opsi ini? John Robbins (dewa debugging windows) menemukan ini ada karena alasan historis.

Kembali ke .NET 1.0 ada perbedaan, tetapi di .NET 2.0 tidak ada. Sepertinya .NET 4.0 akan mengikuti pola yang sama. Setelah memeriksa ulang dengan Tim Debugging CLR, tidak ada perbedaan sama sekali.

Yang mengontrol apakah JITter melakukan build debug adalah sakelar / optimalkan. <…>

Intinya adalah Anda ingin membangun rilis rilis dengan / optimalkan + dan sakelar / debug mana pun sehingga Anda dapat men-debug dengan kode sumber.

lalu dia melanjutkan untuk membuktikannya.

Sekarang pengoptimalan adalah bagian dari sakelar terpisah /optimize(di studio visual disebut Optimize code).

Singkatnya, terlepas dari pengaturan DebugInfo pdb-only atau full, kami akan mendapatkan hasil yang sama. Rekomendasinya adalah untuk menghindari Tidak Ada karena ini akan membuat Anda tidak dapat menganalisis crash dump dari produk yang dirilis atau memasang debugger.

rpattabi.dll
sumber
3
Jawaban yang fantastis! Investigasi saya sendiri (membandingkan file yang dihasilkan) menunjukkan hasil yang sama.
MEMark
@rpattabi Dapatkah Anda menentukan referensi bahwa pdbonly dan full adalah sama? Ini 2019 dan dokumentasinya masih menunjukkan bahwa mereka berbeda dan penuh akan mengalami penurunan kinerja. Dan VS2019 membuat proyek dengan Releasetipe debug konfigurasi secara default disetel ke pdbonly.
joe
@joe Ada diskusi di bagian bawah dokumentasi MSDN msdn.microsoft.com/en-us/library/8cw0bt21.aspx . Coba lihat itu. Seorang kontributor menunjuk ke github.com/dotnet/roslyn/blob/master/docs/compilers/CSharp/… untuk informasi terkini di mana pdbonly dan full disebutkan sama. (FYI. Saya tidak menggunakan windows atau VS lagi. Jadi saya belum mengikuti apa yang terjadi di sana. Tapi setelah saya
ulas
16

Anda hanya menginginkan PDB, tetapi Anda tidak ingin memberikan file PDB kepada pengguna. Memiliki mereka untuk Anda sendiri, di samping binari Anda, memberi Anda kemampuan untuk memuat crash dumps ke dalam debugger seperti WinDbg dan melihat di mana program Anda sebenarnya gagal. Ini bisa sangat berguna ketika kode Anda mogok di komputer yang tidak dapat Anda akses.

Debug penuh menambahkan atribut [Debuggable] ke kode Anda. Ini berdampak besar pada kecepatan. Misalnya, beberapa pengoptimalan loop mungkin dinonaktifkan untuk mempermudah satu langkah. Selain itu, ini memiliki efek kecil pada proses JIT, saat mengaktifkan pelacakan.

blowdart
sumber
Masuk akal. Saya tidak benar-benar mendistribusikan DLL kepada pengguna - ini adalah aplikasi ASP.NET. Tetapi dapatkah Anda meningkatkan jawaban Anda dan membenarkan mengapa Anda harus memilih "pdb-only" vs. "full"? Apakah ini masalah kinerja?
RationalGeek
@jkohlhepp: Saya ingin menambahkan bahwa rilis debugging build agak rumit karena Anda akan kehilangan beberapa informasi (karena JIT). Hampir selalu, Anda tidak akan bisa melihat nilai argumen metode. Untuk mengatasinya, Anda dapat menonaktifkan sementara pengoptimalan JIT menggunakan ini .
Ilian Pinzon
Terima kasih blowdart, dan terima kasih Ilian Pinzon atas info tambahannya. Saya tahu Anda tidak bisa mendapatkan debugging yang sempurna dengan kode rilis tetapi memiliki PDB lebih baik daripada tidak sama sekali.
RationalGeek
Menggunakan pengaturan "penuh" tidak tidak memiliki dampak kinerja. Ini hanya memungkinkan debugger untuk dilampirkan ke proses yang sedang berjalan.
Matt Dard
1
Pertanyaan bagus tentang MSDN Matt, msdn.microsoft.com/en-us/library/8cw0bt21 , menunggu jawabannya sendiri.
Luke Hutton
4

Saya sedang dalam proses menulis pengendali pengecualian yang tidak tertangani dan jejak tumpukan menyertakan nomor baris ketika hanya pdb digunakan, jika tidak, saya hanya mendapatkan nama Sub / Fungsi ketika saya memilih Tidak Ada.

Jika saya tidak mendistribusikan .pdb, saya tidak mendapatkan nomor baris di pelacakan tumpukan bahkan dengan build khusus pdb.

Jadi, saya mendistribusikan (XCOPY menyebarkan pada LAN) pdb bersama dengan exe dari aplikasi VB saya.

rheitzman
sumber