Domanda

Grazie in anticipo a tutti che cercano di aiutarmi. Sto avendo un grosso problema qui, ho trovato un codice di esempio su SYSCTL e lo ha esteso in modo da poter interrogare le interfacce di rete per i loro dati in/out. Quando eseguo questo codice direttamente in main () (senza NSAutoRELELESEPOOL), tutto funziona bene. Tuttavia, una volta che lo aggiungo alla mia classe ed eseguo, ricevo errori di bus e Segfault. Ho rintracciato il problema a NSAutoReleleSepools. Qualcuno può aiutare? (Se non ci credi, basta posizionare un pool di NSAutoReleSepool *= [[NSAutoRELELESEPOOL Alloc] init]; prima del codice e posizionare il tutto in 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 );
        }
    }
È stato utile?

Soluzione

Il NSAutoreleasePool non è il problema. Rivela solo che hai un problema con l'allocazione della memoria, le doppie versioni, i puntatori penzolanti o i dati non inizializzati.

Nel tuo caso, sono dati non inizializzati. Non inizializza il alloc variabile. Di conseguenza, è completamente casuale se buf viene assegnato o punta a una posizione di memoria casuale.

Altri suggerimenti

Il mio intuizione ha a che fare con il tuo uso improprio di strncpy(). Stai copiando sdl->sdl_nlen personaggi. Se questo è più grande di 32, allora stai traboccando il buffer. Se è esattamente 32, allora il tuo incarico di \0 è al di fuori di s[] (probabilmente in buf).

In entrambi i casi, stai passando una sorta di memoria illegale a NSLog(), che a sua volta genera variabili autolerizzate. Probabilmente uno di questi è responsabile dell'incidente quando la piscina si scarica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top