Pregunta Depurar aplicación iOS en dispositivo sin símbolos


Necesito depurar el inicio de una aplicación ios en un dispositivo real ... y al inicio quiero decir primera instrucción esto se ejecuta cuando el sistema operativo le da el control a la aplicación. No es "principal". Además, esta aplicación no tiene ningún símbolo (es decir, la información de depuración aún no está disponible). No me importa si tengo que depurar en el nivel de instrucción de la CPU. Sé cómo hacer eso (lo he hecho por más de 30 años). Quiero que el depurador detener cuando el control está a punto de transferirse a la aplicación. Cuando uso el comando Adjuntar | por nombre y lo ejecuto, solo dice "Ejecutado en ejecución".

Ah, y esta aplicación no fue construido en XCode. Eso es, sin embargo, una aplicación que construí, firmé y aprovisioné y moví al dispositivo. La aplicación se ejecuta porque puedo ver la salida de la consola. En caso de que estés pensando que soy un pirata informático que intenta depurar la aplicación de alguien.

¿Cómo es eso para una orden difícil? Apuesto a que nadie puede responder esto ... No he podido encontrar ninguna información sobre cómo podría hacer esto con un proyecto Xcode. Me pregunto si simplemente no es posible o "permitido" por los señores de Apple.

¿Qué dices, Stack Overflow dioses?

ACTUALIZACIÓN: debo aclarar algo. Esta aplicación es no construido con cualquier herramienta disponible comercialmente o de código abierto. Trabajo con un proveedor de herramientas que crea compiladores, marcos e IDEs. IOW, todavía no puedes obtener esta herramienta ... En el proceso de arranque de una nueva cadena de herramientas, uno regularmente debe recurrir a una depuración cruda de muy bajo nivel. Especialmente si hay errores en el código generado por las herramientas.


32
2018-05-27 21:00


origen


Respuestas:


Voy a responder mi propia pregunta porque creo que he encontrado una solución. Si alguien tiene algo más elegante y simple que esto, por favor responda también. En los pasos:

Comenzando con un ejecutable monolítico en bruto de iOS (no un .app empaquetado, sino el archivo binario mach-o real que es el código máquina).

  1. Cree un nuevo proyecto Xcode vacío con el mismo nombre. Compila y ejecuta en el dispositivo.
  2. Ubique la carpeta .app del paquete de salida.
  3. Copie el ejecutable anterior de iOS sin formato sobre el existente en la carpeta del paquete .app.
  4. La aplicación ahora tendrá una firma no válida y no se puede implementar y ejecutar.
  5. Ejecute codesign contra el paquete de la aplicación (puede encontrar la línea de comando ejecutando xcodebuild en el proyecto Xcode anterior).
  6. En la carpeta .app del paquete, ejecute otool -h -l en la imagen binaria. Localice el comando de carga LC_UNIXTHREAD y encuentre el valor asociado con el registro 'pc'. Esta es la dirección donde el cargador de os saltará a su aplicación. Si esta dirección es impar, estas son las instrucciones de Thumb, de lo contrario será ARM (creo que así es como funciona).
  7. Agregue un punto de corte simbólico (utilicé GDB en lugar de LLDB) e ingresé la dirección como '* 0x00001234' como el símbolo.
  8. Seleccione Producto | Realizar acción | Ejecutar sin construir.

Suponiendo que GDB es capaz de evaluar la expresión de punto de interrupción y establecer el punto de ruptura, y ha seleccionado Producto | Flujo de trabajo de depuración | Mostrar desmontaje Durante la depuración, el proceso debe interrumpirse en la primera instrucción que se ejecutará en la aplicación.

Ahora puede hacer un solo paso con las instrucciones y usar la consola GDB para obtener / establecer valores de registro.


22
2018-05-28 23:50



Su pregunta no tiene sentido: main es el punto de entrada a la aplicación. Es el primer código que debe encontrarse, a menos que haya inicializado () anulado para algunas clases (pero incluso entonces creo que main sería golpeado antes del tiempo de ejecución).

Creo que estás viendo algún tipo de error extraño en el lanzamiento y crees que quieres establecer un punto de interrupción en la entrada para atraparlo, pero es mucho más probable que lo que te ayude sea describir el problema en el lanzamiento y dejar que una de las 4000 personas que haber visto y arreglado el mismo choque te ayuda ...

Sin embargo, si realmente quieres usar GDB para romper una aplicación sin símbolos (pero que inicies desde XCode) puedes hacer que GDB se rompa en una dirección de conjunto de acuerdo con:

¿Cómo interrumpir las instrucciones de ensamblaje en una dirección dada en gdb?

Para encontrar la dirección de main (u otros métodos) puede usar la herramienta o atos, algunos ejemplos en esta pregunta:

Coincidencia de compensaciones en el volcado de emergencia de iOS con el binario desmontado

ADICIÓN:

Si, por algún motivo, XCode no puede iniciar su aplicación para la depuración, también puede realizar un jailbreak e instalar GDB en el dispositivo, lo que le daría un control completo sobre la depuración. Si XCode puede iniciar su aplicación, no veo ninguna razón por la que poder romper una dirección de memoria arbitraria no le proporcione la capacidad que busca ...


2
2018-05-27 21:13



La única solución que encontré es para aplicaciones con vista web pero en el simulador a través de Safari Remote Debugger. Esto está fuera de tema, pero tal vez uno u otro podría beneficiarse.

http://hiediutley.com/2011/11/22/debugging-ios-apps-using-safari-web-inspector/

O usa netcat para IO ... no es la solución más perfecta, pero al menos ves lo que está pasando.


1
2018-05-28 16:53