2012-04-17 17 views
14

Estoy haciendo el desarrollo de juegos iOS usando el framework cocos2d, y envidio tremendamente la habilidad de los programadores Eclipse Java de intercambiar en caliente su código mientras depuran su aplicación (es decir, cambiar los valores variables dentro de un método y tener la actualización en vivo del programa si tuviste un REPL sin tener que recompilar).¿Intercambio de código caliente en Xcode?

Esto parece algo tremendamente útil cuando se trata del desarrollo de iOS, donde mi entorno de desarrollo es (obviamente) Xcode y el lenguaje en el que estoy programando es Objective C. He buscado en Google pero no he podido encuentra algo, así que pensé en preguntarle a la comunidad.

¿Alguien sabe si hay una forma de código de intercambio en caliente en Xcode durante la programación en Objective C?

Gracias de antemano

+1

Xcode solía tener esto, pero IIRC que era lento y poco fiable y la gente simplemente no utilizarlo, por lo que Apple mató a la característica de centrarse en sólo hacer el depurador mejor. – Chuck

+0

Eso es una pena, ¿conoces alguna característica de depuración que proporcione una funcionalidad similar/equivalente? Estoy tratando de reducir el número de veces que cambio una variable y reconstruyo y corro solo para ver si es el número correcto (el desarrollo del juego es mucho de prueba y error) – Salman

+0

Si está en una variable, puedes simplemente editar su valor en depurador –

Respuesta

11

No es posible con las herramientas actuales.

Tenga en cuenta que las aplicaciones de iOS están firmadas: si cambia un solo byte, habrá renunciado a todo. Uno podría imaginar hacerlo funcionar usando el soporte del tiempo de ejecución para agregar y eliminar métodos dinámicamente. Pero eso seguramente requeriría agregar algunas cosas adicionales para soportarlo en el dispositivo, y eso es algo que el malware podría aprovechar fácilmente. Entonces probablemente no sea una característica que probablemente veas pronto.

Por cierto, las versiones de Xcode 1.x-3.x tenían una función "Reparar y continuar". Puede editar mientras estaba depurando, use el comando Reparar y Continuar y continúe ejecutando el código actualizado. Creo que fue eliminado en algún momento, quizás debido a una combinación de: requerir que su proyecto esté configurado para usar "enlace cero" y tal vez algunas otras cosas; ser menos que completamente confiable; probablemente no sea compatible con iOS; el cambio a llvm; otros cambios en Xcode 4. Tal vez vuelva algún día, si lo quieres de regreso, presenta un error, pero una vez más, creo que apoyarlo en iOS sería un desafío.

+0

Esta respuesta parece estar desactualizada. @ bartosz-hernas [respuesta] (http://stackoverflow.com/a/16463529/273628) me indicó lo que parece ser una solución compatible con XCode 7.1: [InjectionPlugin] (https://github.com/johnno1962/injectionforxcode) – ajh158

6

Si solo está hablando de cambiar los valores de las variables, puede lograrlo subrepticiamente a través de lldb (o, presumiblemente) gdb. Suponiendo que tenía:

- (void)uselessMethod 
{ 
    NSString *localString = @"I'm some local text"; 

    NSLog(@"%@", localString); 
} 

y poner un punto de interrupción en el NSLog, en ese punto que se puede pedir LLDB para evaluar una reasignación de localString como un medio para la realización de la misma. P.ej.

po localString = @"Hat" 

Si luego permite que la ejecución del programa continúe, debería encontrar que la reasignación se ha atascado. Del mismo modo, puede llamar a cualquier método o realizar cualquier otro tipo de tarea.

Acabo de probar esto contra Xcode 4.3.2.

+0

Entonces, lo que está diciendo es que es posible dentro del terminal xCode (si estoy usando lldb como compilador, actualmente estaba usando GDB pero solo porque ese era el valor predeterminado), pero esto implicaría 1) establecer un punto de interrupción, y 2) comandos ingresados ​​en el terminal que, si resuelven el problema, tendrían que pasar manualmente al código real. ¿Entendí esto correctamente? – Salman

+0

Entendí que solo preguntaba por cambiar los valores de las variables y supongo que gdb funciona de la misma manera que lldb a este respecto. De lo contrario, creo que estás en lo cierto; No puedo editar y continuar (según la terminología de Microsoft, para asegurarme de haber entendido la pregunta) hasta donde sé. – Tommy

13

Hay un gran complemento que permite cambiar el código en la aplicación en vivo y en funcionamiento. Se llama InjectionPlugin.

Como FAQ dice:

¿Cómo funciona? El tiempo de ejecución de Objective-C le permite cargar una nueva versión de una clase en una aplicación utilizando un paquete, incluso si ya hay una implementación vinculada a la aplicación. Swizzling se usa cuando el paquete se carga para cambiar la clase existente y utilizar los métodos de la nueva implementación. Esto se puede hacer de manera repetida y funciona para aplicaciones OSX e iOS y en dispositivos iOS.

he hecho algunos pequeño video que muestra cómo instalar y utilizar este plugin http://nomtek.com/developers/how-to-install-and-use-injection-plugin-for-xcode/

espero que ayude!

+0

Desafortunadamente no funciona en el dispositivo con Xcode 5. – openfrog

1

, se puede intercambiar en caliente un valor variable en Xcode por:

expression <variable> = <value>;.

Al tener un punto de interrupción en el lugar donde desea cambiar el valor y hacer el comando en la consola de Xcode.

Ejemplo:

// Messages From Console 
(lldb) expression graphFlag = @"X"; // Update variable value 
(__NSCFConstantString *) $0 = 0x36f95718 @"X" // Xcode prints the updated value 
(lldb) expression graphFlag; // Printing value through expression command 
(__NSCFConstantString *) $1 = 0x36f95718 @"X" // Hot Swapped variable value 
Cuestiones relacionadas