2008-08-12 30 views
22

Có trình gỡ rối cấp IL nào dưới dạng một trình cắm thêm VS hoặc ứng dụng độc lập không?Trình gỡ lỗi mã mức IL

Trình gỡ lỗi của studio trực quan rất tuyệt, nhưng nó cho phép bạn gỡ lỗi ở cấp mã HLL hoặc ngôn ngữ lắp ráp, bạn không thể gỡ lỗi IL. Dường như trong một số trường hợp, sẽ có ích khi có cơ hội gỡ lỗi ở cấp IL.

Đặc biệt nó có thể hữu ích khi gỡ lỗi một vấn đề trong mã mà bạn không có nguồn gốc.

Có thể tranh luận nếu thực sự hữu ích khi gỡ lỗi IL khi bạn không có nguồn, nhưng dù sao đi nữa.

Trả lời

19

Cách tốt nhất để làm điều này là sử dụng ILDASM để tháo rời nhị phân được quản lý, sẽ tạo ra các hướng dẫn IL. Sau đó biên dịch lại mã nguồn IL trong chế độ gỡ lỗi bằng cách sử dụng ILASM, khi bạn khởi động trình gỡ lỗi Visual Studio, bạn sẽ có thể bước qua IL thô.

  1. ildasm foo.exe /OUT=foo.exe.il /SOURCE
  2. ilasm foo.exe.il /DEBUG

Tôi đã viết một bài đăng blog về chủ đề này tại địa chỉ: How to debug Compiler Generated code.

+2

Đó là một cách tiếp cận tốt, nhưng bạn không thể sử dụng nó cho một hội đồng đã ký. – axk

0

ISTR có trình gỡ lỗi trình gỡ lỗi cho Trình phản xạ.

Không được sử dụng nó bản thân mình, mặc dù tôi đã sử dụng TestDriven.net để gỡ lỗi một hội đồng của bên thứ 3 với sự trợ giúp của Reflector:

weblogs.asp.net/nunitaddin

0

Dưới đây là một article về IL gỡ lỗi. Nó nói rằng bạn không thể làm điều đó và sau đó nói về cách để làm điều đó. Ngoài ra còn có một số thông tin trong các ý kiến ​​về làm nó cũng.

1

Plugin Debug Companion VS dường như chính xác những gì tôi đang tìm kiếm, ngoại trừ việc nó sẽ không thấy dự án thư viện trong giải pháp của tôi. Chỉ khi tôi thêm một giao diện điều khiển ứng dụng giành chiến thắng vào giải pháp đã làm một cái gì đó xuất hiện trong danh sách các dự án.

Sự cố với cách tiếp cận dịch ngược/biên dịch đối với tôi là mã tôi đang gỡ lỗi không phải là mã của tôi. Tôi có thể đã giải mã nó anyway nhưng tôi nghĩ rằng không có cách nào để ký rằng lắp ráp biên dịch lại để nó được nạp thay vì bản gốc.

Với vấn đề cụ thể, tôi đã bật ra là đủ để chỉ gỡ lỗi nó ở cấp độ ngôn ngữ lắp ráp và nhận lệnh gọi phương thức đã ném ngoại lệ và các tham số mà phương thức được gọi.

1

Đây là tệp .BAT mà tôi sử dụng để gỡ lỗi bộ ghép IL trong Visual Studio. Tệp .IL.IL được tạo có chứa các dòng mã nguồn ban đầu và các dòng lắp ráp IL được tạo của bạn nhưng không hiển thị mã máy được trích xuất. Tôi đặt tên tập tin batch ILDEB.BAT và được gọi là "myDEm mypgm". Tôi sử dụng chỉ thị lắp ráp IL "phá vỡ" để buộc trình gỡ lỗi Visual Studio để phá vỡ khi nhấn.

for /f "tokens=1 delims=." %%1 in ("%1") do set NAME_ONLY=%%1 
@erase/q %NAME_ONLY%.il.il 
@if not exist %NAME_ONLY%.dll goto quit 
ildasm /out:%NAME_ONLY%.il.il /source /nobar %NAME_ONLY%.dll 
@if not exist %NAME_ONLY%.il.il goto quit 
ilasm /dll /debug /out=%NAME_ONLY%.dll %NAME_ONLY%.il.il 
@if not exist %NAME_ONLY%.dll goto quit 
peverify %NAME_ONLY%.dll 
:quit 
+0

Bạn có chạy điều này trong bước xây dựng bài đăng trong môi trường studio trực quan của mình không? –

+1

Hiện tại tôi gọi từ dòng lệnh. Tuy nhiên, tôi không thấy bất kỳ lý do kỹ thuật nào tại sao nó không hoạt động. IIRC, tôi đã thử nghiệm trong bước xây dựng bài đăng và nó hoạt động như mong đợi. – BSalita

+1

Bạn có thể thay thế '% NAME_ONLY%' bằng '% ~ dpn1' và loại bỏ dòng đầu tiên – Adassko