2012-03-07 88 views
5

Tôi đang làm việc trên một hệ thống xây dựng cho ứng dụng MonoTouch khá lớn đang sử dụng nhiều thành phần đa nền tảng. Kết quả là, chúng ta thường gặp phải tình huống mà một trong những thành phần đa nền tảng đó thực hiện một thứ không thể được biên dịch. Nếu một cái gì đó thực sự được thực hiện, việc xây dựng thiết bị sẽ sụp đổ. Tại thời điểm đó, chúng ta phải theo dõi nơi xảy ra sự cố, tìm phương pháp vi phạm và hack nó lên để nó không cố gắng JIT trong bản dựng MonoTouch.Phát hiện JIT tại thời gian biên dịch trong MonoTouch

Câu hỏi của tôi là, có cách nào để phát hiện những điều này trong quá trình xây dựng không? Lúc đầu, chúng tôi đã có một regex đã cố gắng để phát hiện các phương pháp ảo chung, nhưng cũng có vấn đề với một số loại LINQ và lambdas sẽ cố gắng để JIT là tốt, và tôi không muốn viết phân tích cú pháp của riêng tôi để phát hiện chúng tất cả các. Tôi đã thử sử dụng monodis AssemblyName.dll, và nó sẽ cho tôi rất nhiều lỗi phương pháp thiếu, nhưng hầu hết trong số họ dường như vô hại - và ngay cả khi họ không, nó không cho tôi biết nơi mà các tài liệu tham khảo cho biết phương pháp như vậy mà tôi có thể thấy những gì cần phải làm. Ngày đầu đó, đôi khi nó sẽ sụp đổ với Abort trap: 6 hoặc Bus error: 10 trước khi kết thúc lắp ráp, đó là khá vô ích. Có cách nào tốt hơn tôi có thể phát hiện những nỗ lực để JIT trong quá trình xây dựng của tôi?

Trả lời

1

Câu hỏi của tôi là, liệu có một cách để phát hiện những điều này trong quá trình xây dựng?

No. Sử dụng JIT (hoặc chính xác hơn ngoại lệ mà nó đang cố gắng sử dụng JIT) là dự phòng thời gian chạy khi không tìm thấy nội dung nào đó bên trong tệp thực thi gốc. Không phải là không thể (cũng không dễ dàng) để phát hiện (một số/hầu hết) điều kiện dẫn đến trường hợp ngoại lệ bằng cách sử dụng công cụ của riêng bạn (nó thậm chí có thể là một quy tắc Gendarme). Tuy nhiên, đây là một mục tiêu di chuyển vì chúng tôi đang khắc phục sự cố reported vì vậy bạn sẽ phải cập nhật công cụ của mình với mỗi phiên bản mới (hoặc thời gian dành cho rủi ro sửa những thứ không còn là vấn đề nữa).

Điều gì thực sự hữu ích (có hoặc không có công cụ của riêng bạn) là báo cáo các vấn đề đó để chúng có thể được theo dõi và trở thành một phần của bộ thử nghiệm của Xamarin.

Tôi đã cố gắng sử dụng monodis AssemblyName.dll

monodis đòi hỏi phải có quyền truy cập vào tất cả các tài liệu tham khảo lắp ráp, nếu không nó sẽ không hoạt động (và có thể sụp đổ).

+1

Về mục tiêu di chuyển này ... Chúng tôi đã ấn tượng rằng một số thứ như các phương pháp ảo chung không được hỗ trợ bởi vì chúng không thể. Đó có phải là thứ có thể thay đổi không? Chúng tôi không sao báo cáo những điều nên làm việc nhưng không; rắc rối là vũ trụ của những thứ không bao giờ nên hoạt động. –

+0

Cá nhân tôi không biết (ngoại trừ việc biên soạn mọi khả năng) làm thế nào để giải quyết nó (nhưng những người khác đang xem xét các vấn đề. Vì vậy, nghi ngờ bạn tốt hơn điền vào một báo cáo lỗi - trường hợp xấu hơn nó sẽ bị đóng như một bản sao của một hiện tại . – poupou

0

Trên phần "phát hiện": khi bạn tìm ra cấu trúc nào gây ra sự cố, hãy tạo quy tắc tùy chỉnh FxCop phát hiện và chạy nó trên các cụm bình thường. Bằng cách này bạn sẽ không cần phải viết trình phân tích cú pháp của riêng bạn.

Links: FxCop - http://msdn.microsoft.com/en-us/library/bb429476%28v=VS.80%29.aspx Quy tắc tùy chỉnh cho FxCop how-to: http://www.codeproject.com/Articles/30666/7-Steps-to-Write-Your-Own-Custom-Rule-using-FXCOP

+0

Nếu tôi không nhầm, FxCop là công cụ chỉ dành cho Windows và do đó không có sẵn cho chúng tôi. Ngay cả với một số công cụ tương tự trong Mono, vấn đề là nhiều cấu trúc có thể khiến điều này xảy ra, và chúng ta vẫn chưa biết tất cả chúng là gì, vì vậy chúng ta vẫn có thể bỏ lỡ một số cách sử dụng cách tiếp cận giống như FxCop. –

+0

Có kiến ​​thức của tôi. Nên đã tìm ra rằng monotouch == "nền tảng nguồn của bạn không phải là Windows". (Ngoài ra vấn đề của "làm thế nào để phát hiện nếu một trình biên dịch sẽ làm việc thành công trên các nguồn cụ thể" là nói chung khó khăn một (http://en.wikipedia.org/wiki/Halting_problem) :), do đó, tìm kiếm các vấn đề và sau đó phát hiện những người cụ thể trong các nguồn có thể là cách tiếp cận an toàn hơn). –

+0

Điều này có thể dễ dàng hơn vấn đề dừng, trong đó một nỗ lực gọi một phương thức không được biên dịch trước thời hạn nên (theo lý thuyết) có thể khác với một phương pháp, ít nhất theo nghĩa là sẽ có mã cho và không cho cái cũ. Nó chỉ là một vấn đề của việc so sánh như vậy. Lý tưởng nhất, sẽ có một số loại cờ đỏ mà chúng ta có thể tìm thấy trong mã IL được tạo ra. –

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