Cara debug dll yang direferensikan (memiliki pdb)

132

Saya memiliki dua solusi di ruang kerja saya, katakan A dan B.

Solusi A adalah proyek lama yang saya selesaikan dengan pengkodean beberapa waktu lalu. Dalam solusi B, saya perlu menggunakan beberapa kelas dari Solusi A. Untuk melakukannya, saya menambahkan referensi ke dll dari salah satu proyek dalam solusi A.

Masalahnya adalah ketika saya mencoba men-debug. Saya ingin bisa masuk ke kode A juga. Visual studio tidak dapat memuat kode untuk kelas-kelas ini ("Tidak ada kode sumber yang tersedia untuk lokasi saat ini.") Dan saya hanya dapat melihat pembongkaran, yang tidak berguna.

Satu-satunya cara saya tahu untuk men-debug kelas dari solusi A adalah dengan menjalankan solusi B, lepaskan semua proses (dalam item menu Debug) dan lampirkan proses dari solusi A.

Namun, ini sangat merepotkan dan saya hanya bisa men-debug A atau B sekaligus.

Apakah ada cara untuk memungkinkan melangkah ke kode dll yang direferensikan (yang saya punya kode sumbernya)?


Solusi: Kesalahan saya adalah saya berpikir bahwa sebuah proyek hanya dapat menjadi bagian dari solusi tunggal. Bahkan, sebuah proyek dapat menjadi bagian dari sejumlah solusi.
Ketika Anda perlu referensi proyek lama, Anda cukup menambahkan proyek ke solusinya. Ini dilakukan dengan mengklik kanan solusi baru di Solution Explorer> Add> Existing Project.
Kemudian, Anda dapat menambahkan referensi proyek. Seperti yang ditulis orang lain, Anda mungkin harus benar-benar menghindari penggunaan referensi dll untuk kode Anda sendiri (atau kode lain yang mungkin perlu Anda ubah dan debug).

Referensi yang sangat baik tentang bagaimana solusi harus dirancang dapat ditemukan di MSDN .

Elad
sumber
Tautan MSDN itu harus dibaca untuk .net devs (terlepas dari kontrol sumber yang mereka gunakan). Aku heran aku belum melihatnya sebelumnya. Terima kasih!
Pat
Pendatang baru, jika Anda sudah tahu tentang referensi proyek, dan itu bukan opsi (misalnya Anda perlu men-debug paket NuGet), lalu abaikan jawaban yang diterima dan langsung ke yang ini: stackoverflow.com/a/26029208/398630
BrainSlugs83

Jawaban:

113

Jika Anda memiliki referensi proyek , itu harus segera berfungsi.

Jika itu adalah referensi file (dll), Anda perlu simbol debugging (file "pdb") berada di folder yang sama dengan dll. Periksa apakah proyek Anda menghasilkan simbol debug (properti proyek => Build => Advanced => Output / Info Debug = penuh); dan jika Anda telah menyalin dll, letakkan pdb dengannya.

Anda juga dapat memuat simbol secara langsung di IDE jika Anda tidak ingin menyalin file apa pun, tetapi lebih banyak pekerjaan.

Opsi termudah adalah menggunakan referensi proyek!

Marc Gravell
sumber
3
Sayangnya, saya pikir tidak mungkin untuk menambahkan referensi proyek ke proyek dari solusi lain (koreksi saya jika saya salah!).
Elad
7
@ Elad saya baru saja melakukan ini. Pertama tambahkan "proyek yang ada" ke solusinya. Kemudian tambahkan referensi ke proyek dengan mengklik tambahkan referensi proyek. Anda dapat mengatur breakpoint dalam file proyek yang ada. Ini bagus karena file tidak disalin.
user420667
3
Saya memiliki proyek DLL sebagai referensi proyek tetapi break point di dalamnya diabaikan.
Slav
1
Saya sebenarnya bisa men-debug perakitan (rilis-) hari ini yang ditambahkan sebagai referensi file. Bagus untuk saya, tetapi bagaimana itu bisa terjadi? MSVC2010, C #, (ASP) .NET 4.0, rujukan direferensikan ada sebagai rilis debug + (tetapi hanya file rilis ditambahkan ke proyek). Sangat ingin memperjelas ini.
Tobias81
1
Bagi saya itu bekerja satu hari tetapi kemudian hari berikutnya tidak berfungsi (memiliki file DLL dan PDB). Menekan tombol "Empty Symbol Cache" pada Tools> Options> Debugging> Symbols fix it though.
Paul
45

Saya memiliki masalah yang sama. Dia adalah apa yang saya temukan:

1) pastikan semua proyek menggunakan Kerangka yang sama (ini penting!)

2) di Alat / Opsi> Debugging> Umum pastikan "Aktifkan Hanya Kode Saya (Hanya Dikelola) TIDAK dicentang

3) di Alat / Opsi> Debugging> Simbol menghapus semua simbol yang di-cache, hapus centang dan hapus semua lokasi folder di bawah kotak daftar "File simbol ((pdb) lokasi") kecuali kotak centang "Server Simbol Microsoft" default tetapi masih belum dicabut. Hapus juga jalur statis apa pun di kotak teks "Simbol cache di direktori ini". Klik tombol "Empty Symbols Cache". Akhirnya pastikan tombol radio "Only ditentukan modul" dicentang.

4) dalam menu Build / Configuration Manager untuk semua proyek pastikan konfigurasi dalam mode Debug.

scott_f
sumber
3
Masalah saya adalah bahwa kedua proyek saya menggunakan .Net Frameworks: 4.0 dan 4.5 yang berbeda. Tx!
user627283
1) dan 4) sangat penting. Jangan lupa untuk membangun dalam mode Debug dan menggunakan kerangka kerja yang sama.
scott_f
12

Hal lain yang perlu diingat, pastikan dll yang direferensikan tidak dipasang di GAC. Setelah pengujian, saya menginstal dll saya ke GAC untuk melakukan pengujian tingkat sistem. Kemudian, ketika saya harus men-debug kode saya lagi, saya tidak bisa masuk ke majelis yang direferensikan sampai saya menghapusnya dari GAC.

KevinHou
sumber
2
TERIMA KASIH! Ini masalah saya. Saya tidak percaya saya tidak mengetahui hal ini: - / Saya pikir pengaturan referensi proyek entah bagaimana akan menimpa apa yang dipasang di GAC.
SnookerC
Benar! Ini adalah poin yang sangat bagus. Bahkan jika Anda memiliki versi yang sama .NET Framework, jika Anda memiliki kode di GAC ketika Anda mencoba untuk debug itu tidak akan mengenai titik putus jika file .PDB di GAC berbeda maka yang ada di folder proyek Anda. Solusi untuk ini adalah Un-GAC DLL, bangun, lalu pasang kembali GAC.
DigiOz Multimedia
7

Langkah 1: Buka Tools -> Option -> Debugging

Langkah 2: Hapus centang Aktifkan Just My Code

Langkah 3: Hapus centang Memerlukan file sumber yang sama persis dengan Versi asli

Langkah 4: Hapus centang pada Properties dan Operator

Arindam Dhar
sumber
3

Saya memiliki *.pdbfile di folder yang sama dan menggunakan opsi dari Arindam , tetapi masih tidak berhasil. Ternyata saya harus mengaktifkan Aktifkan debugging kode asli yang dapat ditemukan di bawah Properti proyek> Debug .

Roald
sumber
1
info ini harus dimasukkan dalam jawaban yang diterima. ini adalah apa yang saya cari secara spesifik. Terima kasih telah berbagi! +1
Heriberto Lugo
2

Ketika Anda ingin menetapkan breakpoint dalam kode sumber dll yang direferensikan, pertama-tama pastikan bahwa Anda memiliki file pdb yang tersedia untuk itu. Kemudian Anda bisa membuka file kode sumber terkait dan mengatur breakpoint di sana. File sumber tidak perlu menjadi bagian dari solusi Anda. Seperti yang dijelaskan dalam Bagaimana saya bisa menetapkan breakpoint dalam kode referensi di Visual Studio?

Anda dapat meninjau breakpoint Anda melalui jendela breakpoint, tersedia melalui Debug -> Windows -> Breakpoints.

Pendekatan ini memiliki manfaat bahwa Anda tidak diharuskan untuk menambahkan proyek yang ada ke solusi Anda hanya untuk keperluan debugging karena meninggalkannya telah menyelamatkan saya banyak waktu membangun. Jelas, membangun solusi dengan hanya satu proyek di dalamnya jauh lebih cepat daripada membangun solusi dengan banyak dari mereka.

Carl di Veld
sumber
1
Ini hanya berfungsi jika file eksternal tempat Anda meletakkan breakpoint cocok dengan path yang tepat di PDB. (Misalnya, hanya berfungsi jika Anda membuat DLL pada mesin Anda.)
Josh M.
2

Pastikan DLL Anda tidak terdaftar di GAC. Visual Studio akan menggunakan versi di GAC dan mungkin tidak memiliki informasi debug.

Guillermo Prandi
sumber
1

Saya tidak ingin memasukkan proyek perpustakaan kelas eksternal dalam beberapa solusi saya, jadi saya melangkah ke majelis yang saya konsumsi dengan cara yang berbeda.

Solusi saya memiliki direktori "Majelis Umum" yang berisi DLL saya sendiri dari proyek lain. DLL yang saya referensi juga memiliki file PDB yang menyertainya untuk debugging.

Untuk men-debug dan mengatur breakpoints, saya menetapkan breakpoint di sumber aplikasi yang mengkonsumsi di mana saya memanggil metode atau konstruktor dari perakitan dan kemudian langkah INTO (F11) panggilan metode / konstruktor.

Debugger akan memuat file sumber majelis dalam VS dan breakpoint baru di dalam majelis dapat diatur pada saat itu.

Ini tidak langsung tetapi berfungsi jika Anda tidak ingin menyertakan referensi proyek baru dan hanya ingin referensi majelis bersama sebagai gantinya.

Jeff LaFay
sumber
0

Itu harus bekerja. Saya biasa men-debug file .exe dan lain-lain pada saat yang sama! Apa yang saya sarankan adalah 1) Sertakan jalur dll dalam proyek B Anda, 2) Kemudian kompilasi dalam debug proyek A Anda 3) Kontrol bahwa jalur menunjuk pada file A dll dan de pdb .... 4) Setelah itu Anda mulai debug proyek B dan jika semuanya baik-baik saja, Anda akan dapat men-debug di kedua proyek!

Matthieu
sumber
0

Cara maju paling lurus yang saya temukan menggunakan VisualStudio 2019 untuk men-debug perpustakaan eksternal yang Anda referensikan di NuGet, adalah dengan mengambil langkah-langkah berikut:

  1. Alat> Opsi> Debugging> Umum> Untick 'Enable Just My Code'

  2. Pergi ke Assembly Explorer> Buka dari Cache Paket NuGet Daftar barang

  3. Ketikkan nama paket NuGet yang ingin Anda debug di bidang pencarian & klik 'OK' masukkan deskripsi gambar di sini

  4. Dari Assembly Explorer, klik kanan pada assembly yang diimpor dan pilih 'Generate Pdb' masukkan deskripsi gambar di sini

  5. Pilih jalur kustom tempat Anda ingin menyimpan file .PDB dan kerangka yang Anda inginkan untuk menghasilkan ini

    masukkan deskripsi gambar di sini

  6. Salin file .PDB dari folder yang dihasilkan ke folder Debug Anda dan sekarang Anda dapat mengatur breakpoints pada kode perpustakaan rakitan ini

magicode118
sumber
Kedengarannya bagus, kecuali saya tidak dapat menemukan Assembly Explorer; bukankah ini bagian dari Resharper?
Robert Massa