Crash CGImageRef vm_copy failed

Hello,

Encore des soucis... Erreur non reproductible 2 fois de suite bien évidemment sinon ça serait pas drôle :p

En gros, je décode une image au format WebP ce qui se passe correctement dans 90% des cas mais y'a toujours ces 10% de crash que je n'arrive pas à gérer.

Erreur:
2019-05-09 14:39:28.736662+0200 Librairie[10986:2143340] [org.oucho.Librairie] copy_read_only: vm_copy failed: status 1.

Ligne ou ça crash:
https://github.com/Old-Geek/Librairie/blob/master/Librairie/Image/NSData+WebP.m#L59

J'ai bien tenté un try catch pour contourner le problème mais ça ne fonctionne pas.

Une idée ?

Réponses

  • klogklog Membre

    Ca ressemble à un problème d'alignement mémoire (doc vm_copy concernant source_address et dest_address)

  • C'est aussi ce que j'avais trouvé mais les solutions proposé n'ont rien résolu.

    En mettant WebPFreeDecBuffer(&config.output); après CGImageRef cgImage = ... au lieu d'avant a réglé le problème.

    Résolu.

    Merci :)

  • mai 2019 modifié #4

    Mouaip, en faisant ça ça me bouffe toute ma RAM... avec un seul dossier lu contenant des fichiers WebP au lieu de rester à 25Mo d'occupation je passe à 650Mo.

    Si je passe en revue tout mes répertoire je passe à plus de 20Go de ram occupé

    penser à rajouter un CGImageRelease(cgImage);

  • Joanna CarterJoanna Carter Membre, Modérateur

    Peut-être, j'ai trouvé pourquoi ça bouffe la memoire. Dans FolderView.m, tu as une boucle qui appelle [[Comic alloc] initWithFullPath:path]. Ce qui appelle, à son tour, decodeWebP, où se trouve le crash.

    Avec ce type de boucle, tu devrais penser d'utiliser NSAutoReleasePool

        for (NSString *str in array)
        {
          @autoreleasepool
          {
            NSString *path = [NSString stringWithFormat:@"%@/%@", SidebarView.getPath, str];
    
            Comic *comic = [[Comic alloc] initWithFullPath:path];
    
            [comArray addObject:comic];
          }
        }
    
  • @Joanna Carter a dit :
    Peut-être, j'ai trouvé pourquoi ça bouffe la memoire. Dans FolderView.m, tu as une boucle qui appelle [[Comic alloc] initWithFullPath:path]. Ce qui appelle, à son tour, decodeWebP, où se trouve le crash.

    Avec ce type de boucle, tu devrais penser d'utiliser NSAutoReleasePool

        for (NSString *str in array)
        {
          @autoreleasepool
          {
            NSString *path = [NSString stringWithFormat:@"%@/%@", SidebarView.getPath, str];
            
            Comic *comic = [[Comic alloc] initWithFullPath:path];
            
            [comArray addObject:comic];
          }
        }
    

    En fait c'était le CGImage qui bouffait la RAM, le CGImageRelease à résolu le problème. Ca me maintient l'occupation de la RAM à 25-35Mo max.

    Par contre j'en suis à me demander si @autoreleasepool a encore son utilité, partout ou je l'ai testé ça n'a absolument rien changé.

  • CéroceCéroce Membre, Modérateur

    @Harlo a dit :
    En fait c'était le CGImage qui bouffait la RAM, le CGImageRelease à résolu le problème. Ca me maintient l'occupation de la RAM à 25-35Mo max.

    Par contre j'en suis à me demander si @autoreleasepool a encore son utilité, partout ou je l'ai testé ça n'a absolument rien changé.

    On a au moins un autorelease pool à tout moment dans une appli.
    En créer un autre se justifie quand on crée un grand nombre d'objet (disons >10 000) qui ont une durée de vie courte. Typiquement, ça sert pour effectuer un traitement lourd, puis relâcher la mémoire juste après.
    On parle bien d'allocation d'objets (NSObject), donc effectivement, ça n'aura aucune incidence sur la gestion mémoire de CoreGraphics.

  • PyrohPyroh Membre

    Sauf exception, tout ce qui commence en CF ou CG et qui finit par Ref n'est pas managé par l'ARC. Tu dois donc faire le release toi-même. Comme les pointeurs en C.

  • Merci pour les infos, c'est bon à savoir.

  • On trouve des choses intéressante en fouinant dans les SDK.

    Pour ma Queue qui s'occupe du décodage de mes imgs -> DISPATCH_QUEUE_CONCURRENT_WITH_AUTORELEASE_POOL

  • error

  • @Pyroh a dit :
    Sauf exception, tout ce qui commence en CF ou CG et qui finit par Ref n'est pas managé par l'ARC. Tu dois donc faire le release toi-même. Comme les pointeurs en C.

    Bon à savoir - merci Pyroh !

Connectez-vous ou Inscrivez-vous pour répondre.