2010-08-06 9 views
12

Vì một lý do nào đó, đôi khi tôi thấy hữu ích hoặc chỉ thú vị khi xem xét đầu ra trình biên dịch được tối ưu hóa cho một hàm.Làm thế nào tôi có thể xem việc tháo gỡ mã .NET đã được tối ưu hóa?

Đối với mã C/C++ không được quản lý, cách yêu thích của tôi để thực hiện việc này là biên dịch trong Chế độ phát hành, dán điểm ngắt trong chức năng quan tâm, chạy và xem tháo gỡ trong Visual Studio khi nó chạm vào điểm ngắt.

Gần đây tôi đã thử điều này với dự án C# và phát hiện ra rằng kỹ thuật đó không hoạt động. Ngay cả trong chế độ phát hành, việc tháo gỡ tôi thấy rõ ràng là không được tối ưu hóa. Tôi tìm thấy và vô hiệu hóa (trong Visual Studio 2010) các "Gỡ lỗi ... Tùy chọn và cài đặt ... Gỡ lỗi ... Tổng ... Suppress JIT tối ưu hóa trên tải mô-đun" tùy chọn, mà giả sử được gần gũi hơn với những gì tôi muốn, chỉ bây giờ nó cảnh báo tôi khi tôi cố gắng chạy nó, và sau đó tôi không thể làm cho nó dừng lại trên một điểm dừng để tôi có thể thấy việc tháo gỡ.

Vì vậy, nếu tôi muốn xem đầu ra được tối ưu hóa, tháo rời của bộ chia CLR (4.0) cho một chức năng, cách tốt nhất để thực hiện điều đó là gì? Để được rõ ràng, tôi muốn xem x86 (hoặc tốt hơn x86_64) tháo gỡ, không chỉ tháo gỡ IL (mà bạn có thể nhìn thấy trong Reflector).

Trả lời

11

Tất nhiên, sau nửa ngày tìm kiếm câu trả lời cho câu trả lời này, tôi tự tìm câu trả lời 5 phút sau khi tôi hỏi về SO.

Tôi đã đóng; bước mất tích duy nhất từ ​​những gì tôi có trong câu hỏi là "Enable Just My Code" cũng phải được bỏ chọn trong các tùy chọn.

Hướng dẫn đầy đủ có sẵn ở đây: http://blogs.msdn.com/b/vancem/archive/2006/02/20/535807.aspx

+0

Bạn không yêu (và ghét) khi điều đó xảy ra? :) – leppie

+0

@leppie: Khá nhiều. Đó là một trường hợp cần biết giải pháp để biết cụm từ nào cần tìm kiếm để tìm ra giải pháp ... –

0

Bạn có thể thử kiểm tra lắp ráp NGEN'd, nhưng điều đó sẽ khá khó khăn vì không có siêu dữ liệu. Nhưng nó có thể hoạt động :)

3

Tôi tin rằng JIT biết khi nào bạn đang chạy dưới một trình gỡ lỗi, và tạo ra nhiều "debugger thân thiện" mã x86, mà có thể giải thích lý do tại sao mã x86 bạn thấy không được tối ưu hóa.

Bạn có thể thử chạy ứng dụng độc lập, thực thi mã bạn quan tâm ít nhất một lần (vì vậy JIT không kèm theo trình gỡ lỗi), sau đó đính kèm trình gỡ lỗi vào quy trình và đặt điểm ngắt của bạn.

0

Chạy trong VisualStudio bất kể bạn có đang ở chế độ Gỡ lỗi hoặc Phát hành vẫn sẽ chạy trong Trình gỡ lỗi hay không. Bởi vì nó đang chạy dưới trình gỡ rối, nó không thể làm việc với mã được tối ưu hóa.

+1

Điều đó có đúng không? Nếu vậy, thì tại sao bạn có thể đính kèm một trình gỡ rối vào một tiến trình được chạy độc lập với trình gỡ lỗi? Đừng quên rằng VS có thể gỡ lỗi ứng dụng gốc quá, nhưng bạn chỉ thấy tháo gỡ (hướng dẫn lắp ráp) thay vì C# hoặc IL, và bạn thấy thanh ghi thay vì người dân địa phương. Tôi không chắc chắn nếu bạn có thể tải SOS.dll để đào sâu hơn vào bộ nhớ nếu bạn đính kèm vào một quá trình mà không được đưa ra với một trình gỡ lỗi. Cũng lưu ý rằng họ đã thay đổi một số thứ xung quanh API gỡ lỗi/thiết bị gốc với .NET 4, iirc. –

1

Điểm ngắt trong mã được tối ưu hóa không hoạt động ở các chức năng được gạch chân. Nếu bạn muốn xem tháo gỡ một hàm nội tuyến, bạn có thể chèn lệnh System.Diagnostics.Debugger.Break(); vào mã nguồn của bạn.