Debugger un plugin dans Xcode

laurrislaurris Membre
Salut tous,

J'essaie de débugger un plugin avec Xcode. Je voudrais pouvoir compiler le plugin et le charger dans son application cible SANS quitter / relancer l'appli.
Il doit y avoir moyen de décharger/charger un bundle avec un shell script placé dans une build phase.
Oui mais quelle est cette commande si elle existe ? Telle est la question pour laquelle toute réponse reçevra ma reconnaissance éternelle ou presque.

Réponses

  • AliGatorAliGator Membre, Modérateur
    décembre 2006 modifié #2
    Heu... pour charger un plugin, il suffit pas, grosso modo, d'appeler une simple méthode de NSBundle, genre loadBundleWithName ou un truc du genre ?
    Dans ce cas qu'est ce qui t'empêche, même si ce n'est que pendant le debug, de créer un bouton dans ton interface pour charger ton bundle (plugin), et un autre pour le décharger de la mémoire ?
    Et dans ce cas, à  chaque fois que tu veux faire une modif de ton plugin car tu as détecté un bug, tu le décharges de l'appli, tu recompiles la nouvelle version, et tu le recharges.

    D'après la doc Apple, rien n'a l'air d'imposer que ce chargement du plugin se fasse au démarrage de l'appli, donc rien ne t'empêche de le faire sur l'action d'un bouton, non ? (Bon en même temps j'ai jamais fait)
  • laurrislaurris Membre
    23:44 modifié #3
    J'ai oublié de dire que je n'ai pas accès au code de l'appli. Je code juste le plugin. Donc pas possible d'injecter de l'obj-c dans l'appli (ou alors faut qu'on m'explique). C'est pour ça que je cherche la commande shell idoine qui prenne en argument le bundle et l'appli cible.J'ai bien trouvé un truc qui s'appelle "load" mais je comprends pas comment ça fonctionne ...
  • LeChatNoirLeChatNoir Membre, Modérateur
    décembre 2006 modifié #4
    Salut,

    Il y a un super tuto pour "hacker" une appli, c-a-d injecter ton code à  la place de l'original pour modifier son comportement : http://www.culater.net/wiki/moin.cgi/CocoaReverseEngineering

    J'ai utilisé la méthode et ça marche bien. Il y a des liens vers des plug ins pas mal foutus avec les sources (par exemple, le plug in pour mémoriser les tab de safari est pas mal).

    Il faut utiliser l'outils SIMBL qui permet de charger ton plug in lors du lancement de l'appli sur laquelle tu fais ton plug in.
    Ensuite, tu fais du "méthod swizzling", c-a-d que tu remplace l'appel à  la méthode originale par ta méthode. Class-dump est donc fortement conseillé.

    Bref, c'est bricolo mais ça fonctionne bien et ça devrait te guider fortement.

    a+
  • 23:44 modifié #5
    dans 1165520094:

    Il doit y avoir moyen de décharger/charger un bundle avec un shell script placé dans une build phase.

    Qu'est-ce qui te fait penser qu'il y aurait moyen? La plupart des applications qui ont des plug ins les chargent au démarrage, dans le meilleur des cas de les charger en cours d'exécution, mais pour les décharger en cours d'exécution, il faut que l'appli soit spécialement conçue pour, et ça je n'ai encore jamais vu.

    Le mieux que tu puisses faire est de choisir l'appli comme "Custom Excutable" et elle se lancera quand tu voudras "exécuter" ton plug in dans Xcode.
  • AliGatorAliGator Membre, Modérateur
    23:44 modifié #6
    dans 1165538297:

    J'ai oublié de dire que je n'ai pas accès au code de l'appli. Je code juste le plugin. Donc pas possible d'injecter de l'obj-c dans l'appli (ou alors faut qu'on m'explique). C'est pour ça que je cherche la commande shell idoine qui prenne en argument le bundle et l'appli cible.J'ai bien trouvé un truc qui s'appelle "load" mais je comprends pas comment ça fonctionne ...
    Okay au temps pour moi je n'avais pas capté ça.

    Par contre pour la commande shell "load", tu es sûr que tu ne confonds pas avec la commande permettant de charger une kext par exemple ? Ou un truc du genre ? Bref plutôt une commande système ou à  la limite spécifique à  une appli ?
    Car normalement c'est à  l'appli, en Cocoa dans son code, de faire ce qu'il faut pour charger les plugins (cf les petits bouts de code d'exemple sur la page que je t'ai donné plus haut). Donc c'est l'appli qui choisit de charger les plugins quand elle veut, et qui va chercher lesdits plugins dans les répertoires qu'elle veut. Une commande externe à  l'appli et qui n'aurait aucun lien avec cette dernière ne peut pas savoir comment charger un plugin pour elle.
  • laurrislaurris Membre
    23:44 modifié #7
    Merci Renaud et Ali pour vos réponses. Désolé de répondre si tard mais je ne les avais pas vues.
    Effectivement, il faut que l'appli ait prévu un mécanisme de chargement des plugins pour que ça marche (des AppleEvents par exemple, accesibles par applescript). Et comme l'appli mère ne m'appartient pas ( Interface builder ), je suis marron.
    J'suis quand même étonné qu'il n'y ait pas un mode débug pour IB parce que passer sa journée à  décharger des palettes, ça use ! (c'était La blague de Noël au coin du feu).
Connectez-vous ou Inscrivez-vous pour répondre.