32 votes

Déboguer une application iOS sur un appareil sans symboles

J'ai besoin de déboguer le démarrage d'une application ios sur un appareil réel... et par démarrage, j'entends la toute première instruction qui est exécuté lorsque le système d'exploitation cède le contrôle à l'application. Pas "main". De plus, cette application n'a pas de symboles (c'est-à-dire que les informations de débogage ne sont pas encore disponibles ). Je me fiche de devoir déboguer au niveau des instructions du CPU. Je sais comment le faire (je le fais depuis plus de 30 ans). Je veux que le débogueur arrêter lorsque le contrôle est sur le point d'être transféré à l'application. Lorsque j'utilise la commande Attach|by Name et que je l'exécute, le message "Finished running" s'affiche.

Oh, et cette application n'a pas été construit dans XCode . Il s'agit de est Cependant, une application que j'ai construite, signée, provisionnée et déplacée sur le périphérique. L'application fonctionne puisque je peux voir la sortie de la console. Juste au cas où vous penseriez que je suis un hacker essayant de déboguer l'application de quelqu'un.

C'est une commande importante, non ? Je parie que personne ne peut répondre à cette question... Je n'ai pas été en mesure de trouver des informations sur la façon dont je pourrais faire cela avec un projet construit par XCode. Je me demande si ce n'est tout simplement pas possible ou "autorisé" par les seigneurs d'Apple ?

Qu'en dites-vous, dieux de Stack Overflow ?

MISE À JOUR : Je dois clarifier quelque chose. Cette application est pas construit avec n'importe quel outil disponible dans le commerce ou à code source ouvert. Je travaille avec un vendeur d'outils qui crée des compilateurs, des frameworks et des IDEs. Autrement dit, vous ne pouvez pas obtenir cet outil... pour le moment. Lors du processus d'amorçage d'une nouvelle chaîne d'outils, on doit régulièrement recourir à un débogage brut de très bas niveau. Surtout s'il y a des bogues dans le code généré par les outils.

23voto

Allen Bauer Points 11816

Je vais répondre à ma propre question car je pense avoir trouvé une solution. Si quelqu'un a une solution plus élégante et plus simple que celle-ci, merci de répondre également. Passons aux étapes :

En commençant par un exécutable iOS monolithique brut (pas un .app groupé, mais le véritable fichier binaire mach-o qui est le code machine).

  1. Créez un nouveau projet Xcode vide portant le même nom. Construisez-le et exécutez-le sur l'appareil.
  2. Localisez le dossier .app du paquet de sortie.
  3. Copiez l'exécutable iOS brut ci-dessus sur l'exécutable existant dans le dossier du paquet d'applications.
  4. L'application aura maintenant une signature invalide et ne pourra pas être déployée et exécutée.
  5. Exécutez codesign contre le paquet d'applications (vous pouvez trouver la ligne de commande en exécutant xcodebuild sur le projet Xcode ci-dessus).
  6. Dans le dossier .app du bundle, exécutez otool -h -l sur l'image binaire. Localisez la commande de chargement LC_UNIXTHREAD et trouvez la valeur associée au registre 'pc'. Il s'agit de l'adresse à laquelle le chargeur os sautera vers votre application. Si cette adresse est impaire, alors il s'agit d'instructions Thumb, sinon ce sera ARM (je crois que c'est comme ça que ça marche).
  7. Ajoutez un point d'arrêt symbolique (j'ai utilisé GDB au lieu de LLDB) et entrez l'adresse comme '*0x00001234' comme symbole.
  8. Sélectionnez Produit|Exécuter l'action|Exécuter sans construire.

En supposant que GDB soit capable d'évaluer l'expression du point d'arrêt et de le définir, et que vous ayez sélectionné Product|Debug Workflow|Show Disassembly When Debugging, le processus devrait s'interrompre à la toute première instruction à exécuter dans l'application.

Vous pouvez maintenant suivre les instructions en une seule étape et utiliser la console GDB pour obtenir/régler les valeurs des registres.

2voto

Votre question n'a pas de sens - le principal est le point d'entrée dans l'application. C'est le premier code qui devrait être rencontré, à moins que vous n'ayez surchargé initialize() pour certaines classes (mais même dans ce cas, je pense que main serait touché avant le runtime).

Je pense que vous voyez une sorte d'erreur étrange au lancement et que vous pensez que vous voulez mettre un point d'arrêt à l'entrée pour l'attraper, mais il est beaucoup plus probable que ce qui vous aiderait est de décrire le problème au lancement et de laisser l'une des 4000 personnes qui ont vu et corrigé le même crash vous aider....

Cependant, si vous voulez vraiment utiliser GDB pour faire une pause dans une application sans symboles (mais que vous lancez depuis XCode), vous pouvez faire en sorte que GDB fasse une pause sur une adresse d'assemblage :

Comment casser sur l'assemblage dans gdb ?

Pour trouver l'adresse de main (ou d'autres méthodes) vous pouvez utiliser tool ou atos, quelques exemples dans cette question :

Correspondance des offsets dans le dump de crash iOS avec le binaire désassemblé

ADDITION :

Si, pour une raison quelconque, XCode ne peut pas lancer votre application pour le débogage, vous pouvez également jailbreak et installer GDB sur le périphérique lui-même, ce qui donnerait un contrôle complet sur le débogage. Si XCode peut lancer votre application, je ne vois pas pourquoi le fait de pouvoir faire une pause à une adresse mémoire arbitraire ne vous donne pas la capacité que vous recherchez...

1voto

Michael Bunny Points 79

La seule solution que j'ai trouvée est pour les applications avec webview mais dans le simulateur via le débogueur à distance Safari. C'est hors sujet mais peut-être que l'un ou l'autre pourrait en profiter.

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

Ou utilisez netcat pour les IOs ... ce n'est pas la solution la plus parfaite mais au moins vous voyez ce qui se passe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X