2012-03-07 2 views
5

많은 크로스 플랫폼 구성 요소를 사용하는 상당히 큰 MonoTouch 응용 프로그램 용 빌드 시스템에서 작업하고 있습니다. 결과적으로, 우리는 종종 이러한 크로스 플랫폼 구성 요소 중 하나가 컴파일 할 수없는 일을하는 상황에 처하게됩니다. 뭔가 실제로 실행되면 장치 빌드가 중단됩니다. 이 시점에서 우리는 충돌이 발생한 곳을 추적하고 문제의 원인을 찾아 해킹하여 MonoTouch 빌드에서 JIT를 시도하지 않도록해야합니다.MonoTouch에서 컴파일 타임에 JITs 검색하기

제 질문은 빌드 프로세스 중에 이러한 것들을 감지하는 방법이 있습니까? 처음에는 일반 가상 메서드를 검색하려고하는 정규식이 있었지만 JIT도 시도 할 LINQ 및 Lambda의 특정 유형에 대한 문제가 있으며이를 감지하기 위해 내 파서를 작성하려고하지 않습니다. 모든. monodis AssemblyName.dll을 사용해 보았는데 많은 누락 된 메소드 오류가 발생하지만 대부분은 무해한 것으로 보입니다 - 그렇지 않더라도 메소드에 대한 참조가 어디에 있는지는 알려주지 않습니다. 내가해야할 일이 무엇인지 알 수있다. 그 중 어셈블리가 끝나기 전에 Abort trap: 6 또는 Bus error: 10으로 충돌하는 경우가 있습니다. 이는별로 도움이되지 않습니다. 빌드 프로세스에서 JIT 시도를 감지 할 수있는 더 나은 방법이 있습니까?

답변

1

내 질문이있다 빌드 과정에서 이런 일을 감지하는 방법이 있나요? JIT를 (또는이 JIT를 사용하려고하는 것이보다 정확하게 예외)를 사용하여

번호 뭔가가 기본 실행 파일 내에서 발견되지 않는 런타임 대체합니다.

그것은 자신의 도구를 (그것도 Gendarme 규칙 수)를 사용하여 예외로 이어지는 (일부/대부분의) 상태를 검출하는 것은 불가능 (도 쉬운)이 아니다. 그러나 이것은 당신이 각각의 새로운 버전 (또는 위험의 시간을 보내는 더 이상 문제가없는 것을 고정)와 공구를 업데이트해야합니다, 그래서 우리가 reported 문제를 해결하고 이후 대상을 이동합니다. (또는 자신의 도구없이) 정말 도움이 될 것입니다 무엇

은 추적 자 마린의 테스트 스위트의 일부가 될 수 있도록 이러한 문제를보고하는 것입니다. 내가 monodis AssemblyName.dll

monodis 모든 어셈블리 참조에 액세스하는 데 필요한 사용하려고했습니다

, 그렇지 않으면 작동하지 않습니다 (과 충돌 할 수 있습니다).

+1

이 움직이는 목표에 대해 ... 일반적인 가상 방법과 같은 일부 기능은 지원할 수 없기 때문에 지원되지 않았습니다. 그것은 바뀔 수있는 것입니까? 우리는 일을해야하지만하지 말아야 할 일을보고하는 것은 괜찮습니다. 문제는 결코 작동해서는 안되는 것들의 우주입니다. –

+0

개인적으로 나는 (모든 가능성을 컴파일하는 것 제외하고) 어떻게 해결해야 할지를 모르지만 (다른 사람들은이 문제를보고 있습니다.) 의심 스러우면 버그 리포트를 작성하는 것이 더 나을 것입니다 - 더 나쁜 경우에는 기존의 것과 중복되어 닫힙니다 . – poupou

0

"검색"부분 : 문제를 일으키는 구성 요소를 찾아내어 FxCop 사용자 지정 규칙을 검색하여 일반 어셈블리에서 실행하는 사용자 지정 규칙을 만들 때. 이렇게하면 자신 만의 파서를 작성할 필요가 없습니다.

링크 :의 FxCop -의 FxCop에 대한 http://msdn.microsoft.com/en-us/library/bb429476%28v=VS.80%29.aspx 사용자 정의 규칙 사용 방법 : http://www.codeproject.com/Articles/30666/7-Steps-to-Write-Your-Own-Custom-Rule-using-FXCOP

+0

내가 실수하지 않은 경우 FxCop은 Windows 전용 도구이므로 사용할 수 없습니다. 심지어 모노에서 일부 유사한 도구, 문제는 이런 일이 발생할 수있는 많은 구조가 있다는 것을 더, 우리는 아직 그들 모두가 무엇인지 모르는, 그래서 우리는 여전히이의 FxCop과 같은 방법을 사용하여 놓칠 수 있습니다. –

+0

제 지식이 있습니다. monotouch == "소스 플랫폼이 Windows가 아닙니다"라는 것을 알아야합니다. (또한의 문제는 "어떻게 컴파일러는 특정 소스에서 성공적으로 작동하는지 감지"일반적으로 하드 하나에 (http://en.wikipedia.org/wiki/Halting_problem) :), 특히 사람을 너무 문제를 발견하고 감지 소스가 더 안전한 방법 일 수 있음). –

+0

이것은 중단 문제보다 쉽습니다. 미리 컴파일되지 않은 메소드를 호출하려는 시도는 (이론적으로) 적어도 후자에 대한 코드가있을 것이라는 점에서 차이가 있어야합니다 전자에 대해서는 아무도 없다. 그것은 그러한 비교를하는 것의 문제 일뿐입니다. 이상적으로는 생성 된 IL 코드에서 찾을 수있는 일종의 적색 플래그가 있습니다. –