2012-03-07 17 views
5

estoy trabajando en un sistema de construcción para una aplicación bastante grande MonoTouch que está utilizando una gran cantidad de componentes de plataforma cruzada. Como resultado, a menudo nos encontramos con una situación en la que uno de esos componentes multiplataforma hace algo que no puede compilarse. Si ese algo realmente se ejecuta, la compilación del dispositivo se bloqueará. En ese punto, tenemos que rastrear dónde ocurrió el bloqueo, encontrar el método ofensivo y modificarlo para que no intente JIT en la compilación de MonoTouch.los ECI Detección en tiempo de compilación en MonoTouch

Mi pregunta es, ¿hay una manera de detectar estas cosas durante el proceso de construcción? Al principio, tuvimos una expresión regular que intentó detectar métodos virtuales genéricos, pero también hay problemas con ciertos tipos de LINQ y lambdas que también intentarán JIT, y prefiero no intentar escribir mi propio analizador para detectarlos. todas. He intentado usar monodis AssemblyName.dll, y me dará muchos errores de método faltantes, pero la mayoría de ellos parecen ser inofensivos, y aunque no lo fueran, no me dice dónde están las referencias a dicho método. que puedo ver lo que hay que hacer. Además de eso, a veces se bloqueará con Abort trap: 6 o Bus error: 10 antes del final del montaje, lo que es bastante inútil. ¿Hay alguna forma mejor de detectar intentos de JIT en mi proceso de compilación?

Respuesta

1

Mi pregunta es, ¿hay una manera de detectar estas cosas durante el proceso de construcción?

Nº Usando el JIT (o más exactamente la excepción de que está tratando de usar el JIT) es un repliegue tiempo de ejecución cuando no se encuentra algo dentro del ejecutable nativo.

No es imposible (ni fácil) detectar (algunas/la mayoría) de las condiciones que conducen a la excepción usando su propia herramienta (incluso podría ser una regla Gendarme). Sin embargo este es un movimiento objetivo, puesto que estamos arreglando reported problemas por lo que tendrá que actualizar sus herramientas con cada nueva versión (o pasar tiempo de riesgo fijación de cosas que no son cuestiones más).

Lo que sería realmente útil (con o sin su propia herramienta) es reportar este tipo de cuestiones para que puedan ser rastreados y se convierten en parte del conjunto de pruebas de Xamarin.

He intentado usar monodis AssemblyName.dll

monodis requiere tener acceso a todas las referencias de ensamblado, de lo contrario no funcionará (y puede bloquearse).

+1

Acerca de este objetivo en movimiento ... Teníamos la impresión de que algunas cosas, como los métodos virtuales genéricos, no eran compatibles porque no pueden serlo. ¿Es eso algo que podría cambiar? Estamos bien informando cosas que deberían funcionar pero no funcionan; el problema es el universo de cosas que nunca deberían funcionar. –

+0

Personalmente no sé (excepto compilar todas las posibilidades) cómo resolverlo (pero otras personas están viendo los problemas. Por lo tanto, en caso de duda será mejor que complete un informe de error; en el peor de los casos, se cerrará como un duplicado de uno existente) . – poupou

0

En "detectar" parte: cuando a averiguar lo que causa problemas de construcción crean regla personalizada FxCop (s) que lo detecta y ejecutarlo en asambleas normales. De esta forma, no necesitará escribir su propio analizador.

Enlaces: FxCop - http://msdn.microsoft.com/en-us/library/bb429476%28v=VS.80%29.aspx Las reglas personalizadas para FxCop de cómo hacerlo: http://www.codeproject.com/Articles/30666/7-Steps-to-Write-Your-Own-Custom-Rule-using-FXCOP

+0

Si no me equivoco, FxCop es una herramienta sólo para Windows, y por lo tanto no están disponibles para nosotros. Incluso con algunas herramientas similares en Mono, el problema es más que hay muchas construcciones que pueden hacer que esto suceda, y aún no sabemos cuáles son todas, por lo que aún podríamos perder algunas utilizando un enfoque similar a FxCop. –

+0

Sí, que yo sepa. Debería haber descubierto que monotouch == "su plataforma fuente no es Windows". (También el problema de "cómo detectar si un compilador funcionará correctamente en fuentes particulares" es en general uno difícil (http://en.wikipedia.org/wiki/Halting_problem) :), por lo que se encuentran problemas y luego se detectan los particulares en las fuentes pueden ser un enfoque más seguro). –

+0

Esto puede ser más fácil que el problema de detención, en el sentido de que un intento de llamar a un método que no se compiló antes debería ser (teóricamente) diferenciable de uno que fue, al menos en el sentido de que habrá código para el último y ninguno para el primero. Es solo cuestión de hacer tal comparación. Idealmente, habría algún tipo de bandera roja que pudiéramos encontrar en el código IL generado. –

Cuestiones relacionadas