Cách gỡ lỗi một dll được tham chiếu (có pdb)


132

Tôi có hai giải pháp trong không gian làm việc của mình, nói A và B.

Giải pháp A là một dự án cũ hơn mà tôi đã hoàn thành mã hóa một thời gian trước đây. Trong giải pháp B, tôi cần sử dụng một số lớp từ Giải pháp A. Để làm như vậy, tôi thêm một tham chiếu đến dll của một trong các dự án trong giải pháp A.

Vấn đề là khi tôi cố gắng gỡ lỗi. Tôi cũng muốn có thể bước vào mã của A. Visual studio không thể tải mã cho các lớp này ("Không có mã nguồn có sẵn cho vị trí hiện tại.") Và tôi chỉ có thể xem việc tháo gỡ, không hữu ích.

Cách duy nhất tôi biết để gỡ lỗi các lớp từ giải pháp A là chạy giải pháp B, tách tất cả các quy trình (trong mục menu Debug) và đính kèm quy trình từ giải pháp A.

Tuy nhiên, điều này rất bất tiện và tôi chỉ có thể gỡ lỗi A OR B cùng một lúc.

Có cách nào để cho phép bước vào mã của các dll được tham chiếu (mà tôi có mã nguồn) không?


Giải pháp: Sai lầm của tôi là tôi đã nghĩ rằng một dự án chỉ có thể là một phần của một giải pháp duy nhất. Trong thực tế, một dự án có thể là một phần của bất kỳ số lượng giải pháp.
Khi bạn cần tham khảo dự án cũ, bạn chỉ cần thêm dự án vào giải pháp. Điều này được thực hiện bằng cách nhấp chuột phải vào giải pháp mới trong Solution Explorer> Thêm> Dự án hiện có.
Sau đó, bạn sẽ có thể thêm tài liệu tham khảo dự án. Như những người khác đã viết, có lẽ bạn nên tránh hoàn toàn việc sử dụng các tham chiếu dll cho mã của riêng bạn (hoặc mã khác mà bạn có thể cần thay đổi và gỡ lỗi).

Một tài liệu tham khảo rất tốt về cách các giải pháp nên được thiết kế có thể được tìm thấy trong MSDN .


Liên kết MSDN đó là phải đọc cho các nhà phát triển .net (bất kể kiểm soát nguồn họ sử dụng). Tôi ngạc nhiên tôi đã không nhìn thấy nó sớm hơn. Cảm ơn!
Pat

Những người mới đến, nếu bạn đã biết về các tham chiếu dự án và đó không phải là một tùy chọn (ví dụ: bạn cần gỡ lỗi gói NuGet), sau đó bỏ qua câu trả lời được chấp nhận và đi thẳng tới câu hỏi này: stackoverflow.com/a/26029208/398630
BrainSlugs83

Câu trả lời:


113

Nếu bạn có một tài liệu tham khảo dự án , nó sẽ hoạt động ngay lập tức.

Nếu đó là một tham chiếu tệp (dll), bạn cần các ký hiệu gỡ lỗi (tệp "pdb") trong cùng thư mục với dll. Kiểm tra xem các dự án của bạn đang tạo biểu tượng gỡ lỗi (thuộc tính dự án => Build => Advanced => Output / Debug Info = full); và nếu bạn đã sao chép dll, hãy đặt pdb với nó.

Bạn cũng có thể tải các ký hiệu trực tiếp trong IDE nếu bạn không muốn sao chép bất kỳ tệp nào, nhưng nó hoạt động nhiều hơn.

Tùy chọn dễ nhất là sử dụng tài liệu tham khảo dự án!


3
Thật không may, tôi nghĩ rằng không thể thêm tham chiếu dự án vào dự án từ một giải pháp khác (sửa tôi nếu tôi sai!).
Elad

7
@Elad Mình mới làm việc này. Đầu tiên thêm "dự án hiện tại" vào giải pháp. Sau đó thêm một tham chiếu đến dự án bằng cách nhấp vào thêm tham chiếu dự án. Bạn có thể đặt các điểm dừng trong các tệp dự án hiện có. Điều này là tốt vì các tập tin không được sao chép qua.
user420667

3
Tôi có dự án DLL như một tài liệu tham khảo dự án nhưng điểm dừng trong bị bỏ qua.
Slav

1
Tôi thực sự đã có thể gỡ lỗi một hội đồng (phát hành-) ngày hôm nay đã được thêm vào dưới dạng tham chiếu tệp. Tốt cho tôi, nhưng làm thế nào điều đó xảy ra? MSVC2010, C #, (ASP) .NET 4.0, tham chiếu lắp ráp tồn tại dưới dạng gỡ lỗi + phát hành (nhưng chỉ phát hành tệp được thêm vào dự án). Thực sự muốn làm rõ điều này.
Tobias81

1
Đối với tôi nó đã hoạt động một ngày nhưng ngày hôm sau không hoạt động (có tệp DLL và PDB). Nhấn nút "Bộ nhớ cache biểu tượng trống" trên Công cụ> Tùy chọn> Gỡ lỗi> Biểu tượng đã sửa nó.
Paul

45

Tôi gặp vấn đề tương tự. Anh ấy là những gì tôi tìm thấy:

1) đảm bảo tất cả các dự án đang sử dụng cùng một Khung (điều này rất quan trọng!)

2) trong Công cụ / Tùy chọn> Gỡ lỗi> Đảm bảo chung "Bật Chỉ mã của tôi (Chỉ được quản lý) KHÔNG được đánh dấu

3) trong Công cụ / Tùy chọn> Gỡ lỗi> Biểu tượng xóa mọi ký hiệu được lưu trong bộ nhớ cache, bỏ chọn và xóa tất cả các vị trí thư mục trong hộp danh sách "Tệp biểu tượng (.pdb)" ngoại trừ "Máy chủ biểu tượng Microsoft" mặc định nhưng vẫn bỏ chọn nó. Đồng thời xóa mọi đường dẫn tĩnh trong hộp văn bản "Bộ nhớ cache trong thư mục này". Nhấp vào nút "Bộ nhớ cache biểu tượng trống". Cuối cùng, đảm bảo nút radio "Chỉ các mô-đun được chỉ định" được chọn.

4) trong menu Xây dựng / Trình quản lý cấu hình cho tất cả các dự án, đảm bảo cấu hình ở chế độ Gỡ lỗi.


3
Vấn đề của tôi là hai dự án của tôi đã sử dụng các .Net Framework khác nhau: 4.0 và 4.5. Tx!
dùng627283

1) và 4) là rất quan trọng. Đừng quên xây dựng trong chế độ Gỡ lỗi và sử dụng cùng một khung.
scott_f

12

Một điểm khác cần lưu ý, hãy chắc chắn rằng các dll được tham chiếu không được cài đặt trong GAC. Sau khi thử nghiệm, tôi đã cài đặt các dll của mình vào GAC để thực hiện kiểm tra mức hệ thống. Sau này, khi tôi phải gỡ lỗi mã của mình một lần nữa, tôi không thể bước vào các hội đồng được tham chiếu cho đến khi tôi xóa chúng khỏi GAC.


2
CẢM ƠN BẠN! Đây là vấn đề của tôi. Tôi không thể tin rằng tôi đã không hiểu điều này: - / Tôi nghĩ rằng việc thiết lập tham chiếu dự án bằng cách nào đó sẽ ghi đè lên những gì đã được cài đặt trong GAC.
SnookerC

Chắc chắn rồi! Đây là một điểm rất tốt. Ngay cả khi bạn có cùng phiên bản .NET Framework, nếu bạn có mã trong GAC khi bạn cố gắng gỡ lỗi, nó sẽ không đạt điểm dừng nếu tệp .PDB trong GAC khác với tệp trong thư mục dự án của bạn. Một giải pháp cho việc này là Un-GAC DLL, xây dựng, sau đó GAC lại lắp ráp.
Đa phương tiện DigiOz

7

Bước 1: Chuyển đến Công cụ -> Tùy chọn -> Gỡ lỗi

Bước 2: Bỏ chọn Kích hoạt chỉ mã của tôi

Bước 3: Bỏ chọn Yêu cầu tệp nguồn khớp chính xác với Phiên bản gốc

Bước 4: Bỏ chọn Bước trên Thuộc tính và Toán tử


3

Tôi đã có các *.pdbtệp trong cùng một thư mục và sử dụng các tùy chọn từ Arindam , nhưng nó vẫn không hoạt động. Hóa ra tôi cần kích hoạt tính năng gỡ lỗi mã gốc có thể tìm thấy trong Thuộc tính dự án> Gỡ lỗi .


1
thông tin này nên được bao gồm trong câu trả lời được chấp nhận. đó là những gì tôi đã đặc biệt tìm kiếm. cám ơn vì đã chia sẻ! +1
Heriberto Lugo

2

Khi bạn muốn đặt điểm dừng trong mã nguồn của một dll được tham chiếu, trước tiên hãy đảm bảo rằng bạn có sẵn tệp pdb cho nó. Sau đó, bạn có thể chỉ cần mở tệp mã nguồn liên quan và đặt điểm dừng ở đó. Tệp nguồn không cần phải là một phần của giải pháp của bạn. Như đã giải thích trong Làm cách nào tôi có thể đặt điểm dừng trong mã được tham chiếu trong Visual Studio?

Bạn có thể xem lại các điểm dừng của mình thông qua cửa sổ điểm dừng, khả dụng qua Gỡ lỗi -> Windows -> Điểm dừng.

Cách tiếp cận này có lợi ích là bạn không bắt buộc phải thêm một dự án hiện có vào giải pháp của mình chỉ với mục đích gỡ lỗi vì việc bỏ nó đã giúp tôi tiết kiệm rất nhiều thời gian xây dựng. Rõ ràng, xây dựng một giải pháp chỉ có một dự án trong đó nhanh hơn nhiều so với xây dựng một giải pháp với rất nhiều trong số đó.


1
Điều này chỉ hoạt động nếu tệp bên ngoài nơi bạn đặt điểm dừng khớp với đường dẫn chính xác trong PDB. (Ví dụ: chỉ hoạt động nếu bạn xây dựng DLL trên máy của mình.)
Josh M.

2

Hãy chắc chắn rằng DLL của bạn không được đăng ký trong GAC. Visual Studio sẽ sử dụng phiên bản trong GAC và nó có thể sẽ không có thông tin gỡ lỗi.


1

Tôi không muốn bao gồm một dự án thư viện lớp bên ngoài trong một số giải pháp của mình, vì vậy tôi bước vào các hội đồng mà tôi tiêu thụ theo một cách khác.

Các giải pháp của tôi có một thư mục "Common Assemblies" chứa DLL của riêng tôi từ các dự án khác. Các DLL mà tôi tham chiếu cũng có các tệp PDB đi kèm để gỡ lỗi.

Để gỡ lỗi và thiết lập các điểm dừng, tôi đặt điểm dừng trong nguồn của ứng dụng tiêu thụ nơi tôi đang gọi một phương thức hoặc hàm tạo từ cụm và sau đó bước INTO (F11) gọi phương thức / hàm tạo.

Trình gỡ lỗi sẽ tải tệp nguồn của cụm trong VS và các điểm dừng mới bên trong cụm có thể được đặt tại thời điểm đó.

Nó không đơn giản mà chỉ hoạt động nếu bạn không muốn bao gồm một tham chiếu dự án mới và chỉ đơn giản là muốn tham chiếu một hội đồng chia sẻ thay thế.


0

Nó phải hoạt động. Tôi đã sử dụng để gỡ lỗi một tập tin .exe và một dll cùng một lúc! Những gì tôi đề xuất là 1) Bao gồm đường dẫn của dll trong dự án B của bạn, 2) Sau đó biên dịch trong gỡ lỗi dự án A của bạn 3) Kiểm soát rằng đường dẫn trỏ trên tệp A dll và de pdb .... 4) Sau đó bạn bắt đầu gỡ lỗi dự án B và nếu tất cả đều ổn, bạn sẽ có thể gỡ lỗi trong cả hai dự án!


0

Cách chuyển tiếp căng thẳng nhất mà tôi đã tìm thấy bằng VisualStudio 2019 để gỡ lỗi thư viện bên ngoài mà bạn đang tham chiếu trong NuGet, bằng cách thực hiện các bước sau:

  1. Công cụ> Tùy chọn> Gỡ lỗi> Chung> Bỏ chọn 'Kích hoạt chỉ mã của tôi'

  2. Truy cập vào Explorer Explorer> Mở từ NuGet Gói Cache Danh sách mục

  3. Nhập tên gói NuGet bạn muốn gỡ lỗi trong trường tìm kiếm và nhấp vào 'OK' nhập mô tả hình ảnh ở đây

  4. Từ Trình khám phá hội, nhấp chuột phải vào tổ hợp đã nhập và chọn 'Tạo Pdb' nhập mô tả hình ảnh ở đây

  5. Chọn một đường dẫn tùy chỉnh nơi bạn muốn lưu tệp .PDB và khung bạn muốn tạo này cho

    nhập mô tả hình ảnh ở đây

  6. Sao chép tệp .PDB từ thư mục được tạo vào thư mục Gỡ lỗi của bạn và bây giờ bạn có thể đặt điểm dừng trên mã thư viện của hội đồng này


Âm thanh tốt, ngoại trừ tôi không thể tìm thấy bất kỳ Explorer Explorer; Đây không phải là một phần của Resharper sao?
Robert Massa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.