Utiliser gdb. Vous pouvez définir un point d'arrêt qui consigne les arguments dans la méthode et continue. Si vous insistez pour le faire à la dure ... Ce n'est certainement pas simple, mais vous pouvez utiliser la structure de pile sur une architecture/ABI donnée et utiliser l'environnement d'exécution Objective-C pour déterminer le nombre d'arguments et de quelle taille chercher. À partir de maintenant, je suis en territoire inconnu; Je n'ai jamais fait ça et je ne m'en soucierais jamais. Donc YMMV ...
Dans votre méthode, vous pouvez obtenir la structure Method
, puis le nombre d'arguments, puis chaque type d'argument et sa taille. Vous pouvez ensuite marcher la pile de l'adresse du paramètre self
(c.-à-&self
), en supposant saviez ce que vous faisiez ...
Method method = class_getInstanceMethod([self class], _cmd);
unsigned nargs = method_getNumberOfArguments(method);
void *start = &self;
for(unsigned i = 0; i<nargs; i++) {
char *argtype = method_copyArgumentType(method, i);
//find arg size from argtype
// walk stack given arg zie
free(argtype);
}
En chemin, vous auriez à convertir la chaîne de argtype (en utilisant Objective-C type encodings) à la taille de chaque argument de la pile.
Bien sûr, vous devez dériver la chaîne de format pour chaque type et appeler NSLogv
avec un tableau d'arguments variable approprié contenant les arguments copiés à partir de leur emplacement sur la pile. Probablement beaucoup plus de travail que sa valeur. Utilisez le débogueur.
Vous ne voulez pas l'adresse de la variable 'self'? À partir du pointeur d'objet * dans * la variable 'self' n'imprime pas les arguments de la méthode; c'est l'impression des variables d'instance de l'objet (probablement comme garbage, puisque vous utiliseriez les types d'arguments method pour le guidage [mis]). –
Oui, absolument, à partir de & self. –
Voilà ce que je veux dire: "start" ne devrait-il pas être initialisé à "& self", pas "self"? –