Depurar la aplicación iOS en el dispositivo sin símbolos

Necesito depurar el inicio de una aplicación ios en un dispositivo real … y al iniciarme me refiero a la primera instrucción que se ejecuta cuando el sistema operativo entrega el control a la aplicación. No es "principal". Además, esta aplicación no tiene símbolos (es decir, la información de debugging no está disponible … aún). No me importa si tengo que depurar el nivel de instrucción de la CPU. Sé cómo hacerlo (hace más de 30 años). Quiero que el depurador se detenga cuando el control esté a punto de transferirse a la aplicación. Cuando uso el command Adjuntar por nombre y ejecutarlo, simplemente dice "Terminado de ejecutar".

Ah, y esta aplicación no fue construida en XCode . Sin embargo, es una aplicación que construí, firmé y aprovisioné y trasladé al dispositivo. La aplicación se ejecuta porque puedo ver la salida de la console. Por si acaso estás pensando que soy un hacker que intenta depurar la aplicación de alguien.

¿Cómo es eso para una order alta? Apuesto a que nadie puede responder a esto … No he podido encontrar ninguna información sobre cómo podría hacer esto con un proyecto construido con XCode. Me pregunto si simplemente los "overlords" de Apple no son posibles o "permitidos".

¿Qué dices, dioses Stack Overflow?

ACTUALIZACIÓN: Debería aclarar algo. Esta aplicación no está construida con ninguna herramienta de código abierto o disponible comercialmente. Trabajo con un proveedor de herramientas que crea comstackdores, frameworks y IDEs. IOW, no puedes get esta herramienta … todavía. En el process de arranque de una nueva cadena de herramientas, uno debe recurrir regularmente a una debugging en bruto de muy bajo nivel. Especialmente si hay errores en el código generado por las herramientas.

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

Comenzando con un ejecutable iOS monolítico sin procesar (no con un package .app, sino con el file binary real mach-o que es el código máquina).

  1. Cree un nuevo proyecto vacío Xcode con nombre similar. Genere y ejecútelo en el dispositivo.
  2. Localice la carpeta .app del package de salida.
  3. Copie el ejecutable iOS sin procesar anterior sobre el existente en la carpeta del package .app.
  4. La aplicación ahora tendrá una firma no válida y no se puede desplegar ni ejecutar.
  5. Ejecute códigos de identificación contra el package de aplicaciones (puede encontrar la command-line ejecutando xcodebuild en el proyecto Xcode anterior).
  6. En la carpeta .app del package, ejecute otool -h -l en la image binaria. Localice el command de carga LC_UNIXTHREAD y encuentre el valor asociado con el logging 'pc'. Esta es la dirección donde el gestor de ómnibus saltará a su aplicación. Si esta dirección es extraña, estas son instrucciones de Thumb, de lo contrario, será ARM (creo que así es como funciona).
  7. Agregue un punto de corte simbólico (usé GDB en lugar de LLDB) e ingrese la dirección como '* 0x00001234' como el símbolo.
  8. Seleccione Producto | Realizar acción | Ejecutar sin build.

Suponiendo que GDB es capaz de evaluar la expresión del punto de interrupción y establecer el punto de interrupción, y ha seleccionado Product | Debug Workflow | Show Disassembly When Depurating, el process debe romperse en la primera instrucción que se ejecutará en la aplicación.

Ahora puede dar instrucciones paso a paso y usar la console GDB para get / configurar valores de logging.

Su pregunta no tiene sentido: principal es el punto de input en la aplicación. Es el primer código que se debe encontrar, a less que posiblemente haya inicializado () anulado para algunas classs (pero incluso entonces creo que el principal sería alcanzado antes del time 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 input para atraparlo, pero lo más probable es que lo que te ayude sea describir el problema en el lanzamiento y dejar que una de las 4000 personas que Han visto y reparado el mismo locking que usted …

Sin embargo, si realmente desea utilizar GDB para dividir en una aplicación sin símbolos (pero que se inicia desde XCode), puede tener una ruptura de GDB en una dirección de ensamblaje como:

¿Cómo dividir las instrucciones de assembly en una dirección determinada en gdb?

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

Hacer coincidir los desplazamientos en el volcado de lockings de iOS a binary desarmado

ADICIÓN:

Si por alguna razón XCode no puede ejecutar su aplicación para debugging, también podría jailbreak e instalar GDB en el dispositivo mismo, lo que daría un control total sobre la debugging. Si XCode puede iniciar su aplicación, no veo ninguna razón por la que poder dividir en una dirección de memory arbitraria no le brinde la capacidad que busca …

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

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

O use netcat para IOs … no es la solución más perfecta, pero al less se ve lo que está sucediendo.