2008-12-08 37 views
13

Tôi đang sử dụng một DLL của bên thứ ba. Đối với một số trường hợp cụ thể, một hàm trong DLL là ném một ngoại lệ. Có thể gỡ lỗi DLL trong Visual Studio?Gỡ lỗi DLL của bên thứ ba trong Visual Studio?

Sau the answer from Andrew Rollings, tôi có thể xem mã, nhưng có cách nào dễ dàng để gỡ lỗi thông qua mã trong Visual Studio không?

+1

Vâng, trích xuất mã vào tệp, thêm chúng vào một dự án dll và biên dịch lại dll. Thêm dự án này vào giải pháp của bạn và thay đổi các tham chiếu để trỏ đến dự án đó. Sau đó, bạn sẽ có thể gỡ lỗi nó. –

+0

Tôi gặp vấn đề tương tự. Tất cả các nguồn đều thuộc về tôi, nhưng tôi không thể chỉ thêm chúng vào dự án tham chiếu. Có hơn 20 dự án liên quan ... Và không có giải pháp nào dưới đây thực sự giúp đỡ – TimothyP

Trả lời

15

Nếu DLL ở ngôn ngữ .NET, bạn có thể dịch ngược nó bằng công cụ như .NET Reflector và sau đó gỡ lỗi chống lại mã nguồn.

Hoặc bạn có thể hỏi nhà cung cấp nếu mã nguồn có sẵn. Đó có lẽ là cách dễ nhất.

+0

Đó là dll .Net và tôi có một phản xạ, hãy để tôi thử làm điều này. Cảm ơn. – Biswanath

+2

NET Reflector 6 đi kèm với Visual Studio Addin cho phép bạn sử dụng Visual Studio's step-through-debugging trên các assembly mà bạn không có mã nguồn. –

5

Xây dựng dựa trên câu trả lời của Andrew, bạn chỉ xử lý mã nguồn bị biên dịch dưới dạng thư viện mới trong dự án của mình và đặt điểm ngắt trong nguồn. Loại bỏ tất cả các tham chiếu đến DLL của bên thứ 3 sao cho nó là mã được giải mã đang thực hiện.

Những điều khác:

  • Bạn có thể vi phạm pháp luật bởi dịch ngược mã, hoặc vi phạm một thỏa thuận cấp phép với các nhà cung cấp bên thứ 3. Hãy chắc chắn để xem xét điều này với một ai đó.
  • Bạn sẽ muốn đảm bảo rằng bạn loại bỏ các tham chiếu đến phiên bản đã biên dịch của bạn nếu bạn đang chuyển sang các nhà phát triển khác hoặc kiểm tra vào một cây nguồn lớn hơn. Dễ quên điều này!
+3

+1 để nâng cao nhận thức về khả năng vi phạm pháp luật hoặc vi phạm các thỏa thuận cấp phép – JeffH

0

Tôi nghĩ .NET Reflector có một số plugin gỡ lỗi. Đó sẽ là một ý tưởng tốt hơn nhiều vì việc biên dịch lại và biên dịch mã nói chung không thành công, và bạn cần phải thực hiện rất nhiều thay đổi trong mã để sửa nó.

Cung cấp cho trình gỡ lỗi .NET Reflector. Nó có thể giúp bạn rất nhiều.

3

Có hai phương pháp tôi đã đi qua:

1) Truy cập vào dự án DLL từ sử dụng dự án. Điều này liên quan đến việc xây dựng các DLL trong một trường hợp riêng biệt của Visual Studio và sau đó truy cập vào DLL thông qua một dự án khác nhau trong Visual Studio (điều này giả định bạn có mã nguồn). Có một số cách để thực hiện điều này:

  • Bạn có thể thêm Trace.WriteLine báo cáo trong DLL mà sẽ hiển thị lên trong cửa sổ 'Output' trong Visual Studio.
  • Bạn có thể thêm System.Diagnostics.Debugger.Break() câu lệnh vào mã DLL. Khi chạy dự án gọi điện trong Visual Studio, thực thi chương trình sẽ dừng ở đó. Từ đây bạn có thể thêm truy cập gọi stack (bao gồm tất cả các chức năng cuộc gọi trong DLL chính nó) và thiết lập nghỉ điểm (mặc dù biểu tượng cho breakpoint sẽ xuất hiện vô hiệu hóa và văn bản di chuột cho điểm break sẽ đọc " Điểm ngắt sẽ hiện không bị trúng. Không có ký hiệu đã được tải cho tài liệu này ").
  • Nếu DLL được ném một ngoại lệ (mà bạn có thể nhìn thấy từ cửa sổ 'Output' nếu ngoại lệ được bắt và xử lý bởi các DLL) bạn có thể nói với Visual Studio để luôn luôn phá vỡ khi rằng loại ngoại lệ là ném. Hit Ctrl +Alt +E, tìm ra loại ngoại lệ được ném, và nhấn cột 'Ném' cho rằng ngoại lệ. Từ đây chính xác là như thể bạn đã sử dụng System.Diagnostics.Debugger.Break() (xem bên trên).

2) Đính kèm quy trình sử dụng cho dự án DLL. Điều này liên quan đến việc hooking trình gỡ rối Visual Studio vào một tiến trình đang chạy.

  • Mở dự án DLL trong Visual Studio.
  • Chạy ứng dụng sử dụng DLL (ứng dụng này không thể chạy từ một phiên bản khác của Visual Studio vì quá trình sẽ có trình gỡ lỗi được đính kèm).
  • Từ đây bạn có thể thêm điểm ngắt và bước qua mã DLL được tải trong Visual Studio (mặc dù điểm ngắt sẽ xuất hiện bị vô hiệu hóa giống như trong phương pháp 1).
+0

Cảm ơn bạn đã chỉnh sửa @Peter, giờ đây đã đẹp hơn rất nhiều. –

3

Đã xảy ra sự cố với một số thư viện của bên thứ ba cũng như .NET chính nó là WinDbg. Nó là một trình gỡ lỗi tuyệt vời của Microsoft mà tôi đã sử dụng để khắc phục một số vấn đề dính đã xảy ra sâu bên trong khung công tác.

Bạn cần sử dụng tiện ích mở rộng Son of Strike (SOS) nếu đó là một DLL được quản lý. Nó cũng có thể gỡ lỗi bản địa. Bạn sẽ cần phải biết một chút về callstacks và lắp ráp/CIL hướng dẫn để được tốt lúc sử dụng nó. Bạn sẽ có thể xác định ngoại lệ và những gì đang gây ra nó. Chúng tôi đã sử dụng WinDbg/SOS để tìm kiếm ví dụ trong HttpWebResponse, nếu bạn đang sử dụng nén Gzip để tải xuống một trang và máy chủ trả về tiêu đề Gzip không hợp lệ, .NET sẽ chạy giải nén trong luồng và một sự cố sẽ đưa ra quy trình của bạn. Happy debugging.

+0

Tôi nghĩ rằng giải pháp này có thể là quá mức cần thiết cho câu hỏi của OP NHƯNG đó là thực sự có lợi cho lỗi hardcore như rò rỉ bộ nhớ, ngẫu nhiên treo trong IIS vv .. anyways trả lời tốt đẹp, chỉ một vài người trong chúng ta sử dụng trong những ngày này lol – sotn

0

.NET Reflector 6 đi kèm với Visual Studio Addin cho phép bạn sử dụng Visual Studio's step-through-debugging trên các assembly mà bạn không có mã nguồn.

Hãy xem bài đăng trên blog này:

http://www.simple-talk.com/community/blogs/alex/archive/2009/09/22/74919.aspx để biết thêm chi tiết.

Đây vẫn là bản dựng rất sớm. Vì vậy, không đảm bảo rằng nó sẽ làm việc, và nó có thể phá vỡ cấu hình studio hình ảnh của bạn hoặc cấu hình dự án. Đảm bảo bạn có bản sao lưu (hoặc kiểm soát nguồn) cho bất kỳ dự án nào bạn sử dụng tính năng này.

Tải ở đây: http://www.red-gate.com/MessageBoard/viewforum.php?f=109

Các vấn đề liên quan