Question

Merci d'avance à tout le monde d'essayer de m'aider.Je vais avoir un gros problème ici, j'ai trouvé un exemple de code sur sysctl et étendu afin que je puisse interroger les interfaces réseau pour leur/sortie de données.Lorsque j'exécute ce code directement dans le main() (sans NSAutoreleasePool) tout fonctionne bien.Cependant, une fois que je l'ajoute à ma classe et à exécuter ce que je reçois de bus de messages d'erreurs et d'erreurs de segmentation.J'ai suivi l'émission vers le bas pour NSAutoreleasePools.Quelqu'un peut-il aider s'il vous plaît?(Si vous ne le croyez pas, il suffit de placer un NSAutoreleasePool *piscine = [[NSAutoreleasePool alloc] init];avant le code et placez le tout dans le main())

int mib[] = { CTL_NET, PF_ROUTE, 0, 0, NET_RT_IFLIST, 0 };

    int alloc;

    struct if_msghdr    *ifm, *nextifm;
    struct sockaddr_dl  *sdl;
    char        *lim, *next;
    size_t      needed;
    char        s[32];

    char* buf;
    if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
        return 0;

    if (alloc < needed) {
        buf = malloc(needed);
        if (buf == NULL)
            return 0;
        alloc = needed;
    }

    if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0)
        return 0;
    lim = buf + needed;

    next = buf;
    while (next < lim) {
        ifm = (struct if_msghdr *)next;

        if (ifm->ifm_type != RTM_IFINFO)
            return 0;
        next += ifm->ifm_msglen;

        while (next < lim) {
            nextifm = (struct if_msghdr *)next;
            if (nextifm->ifm_type != RTM_NEWADDR)
                break;
            next += nextifm->ifm_msglen;
        }        

        if (ifm != NULL && ifm->ifm_flags & IFF_UP) {
            sdl = (struct sockaddr_dl *)(ifm + 1);
            if (sdl->sdl_family != AF_LINK)
                continue;
            strncpy(s, sdl->sdl_data, sdl->sdl_nlen);
            s[sdl->sdl_nlen] = '\0';
            NSLog(@"interface %s in %qu out %qu \n", s,(UInt64)ifm->ifm_data.ifi_ibytes, (UInt64)ifm->ifm_data.ifi_obytes );
        }
    }
Était-ce utile?

La solution

L' NSAutoreleasePool n'est pas le problème.Il révèle juste que vous avez un problème avec l'allocation de la mémoire, double communiqués, balançant des pointeurs ou des données non initialisées.

Dans votre cas, c'est des données non initialisées.Vous n'avez pas initialiser le alloc variable.En conséquence, il est complètement aléatoire si buf est alloué ou vers certains emplacement de mémoire vive.

Autres conseils

Mon intuition c'est que c'est à voir avec votre mauvaise utilisation de strncpy().Vous êtes à la copie sdl->sdl_nlen des personnages.Si cette taille est supérieure à 32, alors vous êtes débordement de tampon.Si c'est exactement 32, puis l'attribution d' \0 est à l'extérieur de s[] (probablement en buf).

Dans les deux cas, vous êtes de passage quelques sorte illégal de la mémoire à NSLog(), qui lui-même génère autoreleased variables.Probablement l'un de ceux qui est responsable de l'accident lorsque la piscine drains.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top