Crashes avec CGContextDrawPath

Eric P.Eric P. Membre
décembre 2021 modifié dans API communes #1

Bonsoir,

J'ai des retours de crashes dans l'organizer de Xcode que je n'arrive pas à reproduire ni à résoudre.
C'est dans mon application iPocket Draw (et iPocket Draw Lite) dans la routine de dessin de la grille.
A priori cela arrive sur cette séquence :
CGContextMoveToPoint(contex, m_r, 0); CGContextAddLineToPoint(contex, m_r, h_screen); CGContextStrokePath(contex);

Les logs d'erreur sont du style :
0 libsystem_malloc.dylib 0x0000000194d7c0c8 small_size + 56 (magazine_inline.h:0)
1 libsystem_malloc.dylib 0x0000000194d79860 szone_size + 96 (magazine_malloc.c:374)
2 libsystem_malloc.dylib 0x0000000194d75020 free + 148 (malloc.c:700)
3 CoreGraphics 0x00000001850b7c7c ripr_Finish + 104 (aaline.c:2089)
4 CoreGraphics 0x0000000185066208 ripc_Render + 548 (RIPRender.c:1119)
5 CoreGraphics 0x00000001850a3a2c ripc_DrawPath + 416 (RIPContext.c:1733)
6 CoreGraphics 0x000000018506b148 draw_path + 400 (CGContextPath.c:0)
7 CoreGraphics 0x00000001850b40b0 CGContextDrawPath + 336 (CGContextPath.c:412)
8 iPocket Draw 0x0000000100b97838 -[TDrawingSpace dessine_grid:] + 600 (TDrawingSpace.m:1297)

ou

0 CoreGraphics 0x0000000183af1eb4 aal_stroke_iterate + 136 (aaline.c:2911)
1 CoreGraphics 0x0000000183b2692c ripr_path_stroke + 144 (RIPRender.c:0)
2 CoreGraphics 0x0000000183a7fbac __CGPathApply_block_invoke + 92 (CGPath.cc:863)
3 CoreGraphics 0x0000000183a76418 CG::Path::apply(void (CGPathElementType, CGPoint const*, bool*) block_pointer) const + 452 (path.cc:1706)
4 CoreGraphics 0x0000000183a7509c CGPathApply + 180 (CGPath.cc:854)
5 CoreGraphics 0x0000000183ae259c RIPRenderPath + 164 (RIPRender.c:710)
6 CoreGraphics 0x0000000183ac7a14 ripc_DrawPath + 392 (RIPContext.c:1729)
7 CoreGraphics 0x0000000183a8f148 draw_path + 400 (CGContextPath.c:0)
8 CoreGraphics 0x0000000183ad80b0 CGContextDrawPath + 336 (CGContextPath.c:412)
9 iPocket Draw Lite 0x000000010231ae8c -[TDrawingSpace dessine_grid:] + 600 (TDrawingSpace.m:1297)

ou

0 libsystem_platform.dylib 0x00000001dd30701c os_unfair_lock_lock_with_options$VARIANT$mp + 24
1 libsystem_malloc.dylib 0x0000000193e43984 free_small + 124 (locking.h:48)
2 CoreGraphics 0x00000001850ce8f8 ripr_Finish + 112 (aaline.c:1022)
3 CoreGraphics 0x000000018507d75c ripc_Render + 544 (RIPRender.c:1119)
4 CoreGraphics 0x00000001850baa44 ripc_DrawPath + 412 (RIPContext.c:1733)
5 CoreGraphics 0x00000001850825a8 draw_path + 372 (CGContextPath.c:0)
6 CoreGraphics 0x00000001850cae38 CGContextDrawPath + 284 (CGContextPath.c:412)
7 iPocket Draw Lite 0x0000000100a86e8c -[TDrawingSpace dessine_grid:] + 600 (TDrawingSpace.m:1297)

J'ai essayé d'entrer des données débiles dans les réglages de la grille mais je n'obtiens jamais d'erreur.

Quelles genres de données peuvent faire planter CGContextStrokePath ?

Réponses

  • T'as pas de message d'erreur en plus de la call stack ?

  • Pas vu, où est-ce normalement ?

  • Le texte qui est juste au dessus de la call stack.

    Par exemple :

    [Des trucs avant]
    
    Application Specific Information:
    terminating with uncaught exception of type NSException
    *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: <_TtC17PreviewsInjectionP33_5C15DEDE49077CE9D3A2C754AF2F760525MacOSPreviewHostingWindow: 0x14c428ef0>. "frame=CGRectContainsRect(CGRectMake((CGFloat)INT_MIN, (CGFloat)INT_MIN, (CGFloat)INT_MAX - (CGFloat)INT_MIN, (CGFloat)INT_MAX - (CGFloat)INT_MIN), frame)"'
    dyld4 config: DYLD_LIBRARY_PATH=/Users/pyroh/Library/Developer/Xcode/DerivedData/*****-fvvjfjpdrzrdymedrhmrzljaphep/Build/Intermediates.noindex/Previews/*****/Products/Debug DYLD_FRAMEWORK_PATH=/Users/pyroh/Library/Developer/Xcode/DerivedData/*****-fvvjfjpdrzrdymedrhmrzljaphep/Build/Intermediates.noindex/Previews/*****/Products/Debug
    abort() called
    
    
    Application Specific Backtrace 0:
    0   CoreFoundation                      0x00000001affc012c __exceptionPreprocess + 240
    1   libobjc.A.dylib                     0x00000001afd11808 objc_exception_throw + 60
    2   Foundation                          0x00000001b0f32e20 -[NSMutableDictionary(NSMutableDictionary) initWithContentsOfFile:] + 0
    3   AppKit                              0x00000001b2ae8044 -[NSWindow _reallySetFrame:] + 1040
    4   AppKit                              0x00000001b2ae7874 -[NSWindow _oldPlaceWindow:fromServer:] + 228
    ...
    
    [Des trucs après]
    

    Les noms des produit/projet ont été remplacés pas *****, c'est normal.

  • Non il n'y a rien :
    `
    Incident Identifier: 8A701B88-ABCD-467B-8A28-AFF0D7CD88FF
    Hardware Model: iPhone13,1
    Process: iPocket Draw [765]
    Path: /private/var/containers/Bundle/Application/5ED06A18-1316-4F2C-9E16-2551F3AA249A/iPocket Draw.app/iPocket Draw
    Identifier: com.adxonline.ipocketdraw
    Version: 3.21 (3.21.0)
    AppStoreTools: 13A1030d
    AppVariant: 1:iPhone13,1:14
    Code Type: ARM-64 (Native)
    Role: Background
    Parent Process: launchd [1]
    Coalition: com.adxonline.ipocketdraw [667]

    Date/Time: 2021-12-08 08:14:31.6033 +0800
    Launch Time: 2021-12-08 08:14:14.8563 +0800
    OS Version: iPhone OS 15.1.1 (19B81)
    Release Type: User
    Baseband Version: 2.11.04
    Report Version: 104

    Exception Type: EXC_CRASH (SIGKILL)
    Exception Codes: 0x0000000000000000, 0x0000000000000000
    Exception Note: EXC_CORPSE_NOTIFY
    Triggered by Thread: 0

    Thread 0 name:
    Thread 0 Crashed:
    0 CoreGraphics 0x0000000182e28010 ripc_InitializeColorTransform + 276 (RIPContext.c:128)
    `

  • Là comme ça sans message plus précis et sans accès au code je vois pas trop ce qui pourrait t'aider.
    Si on reprend le bout de code que tu donne :

    CGContextMoveToPoint(contex, m_r, 0); 
    CGContextAddLineToPoint(contex, m_r, h_screen); 
    CGContextStrokePath(contex);
    

    Je commencerai par vérifier si contex n'est pas NULL et que ni m_r ni h_screen ne sont NaN. Est-ce que tu ne fais pas des choses bizarres avec ton graphic context non plus ? Bref ça va pas trop t'aider...

  • J'ai essayé de mettre une valeur x/0 pour avoir NaN et dans ce cas le code d'erreur est explicite.
    Le plus étrange est que je n'arrive pas à reproduire l'erreur.
    Il s'agit de la procédure d'affichage de la grille optionnelle et paramétrable du dessin.
    J'ai également essayé d'entrer des valeurs farfelues dans les paramètres de la grille mais sans pouvoir provoquer le crash...

  • Ben maintenant y'a pas 36 solutions: tu nous montre un peu plus de code relatif au dessin de la-dite grille et on essaie de trouver un bug; tu prends tous tes bug reports et tu passe toutes les 3/4 méthodes en haut de chaque call list dans google pour voir si il ne trouve pas quelque chose.

    Ça peut également être un bug lié à iOS sur lequel tu n'as aucun contrôle, est-ce présent sur une version en particulier. Certains utilisateurs jailbreakent leur appareil ce qui peut rendre le système instable. Si c'est un phénomène rare tu peux aussi laisser couler, mais ça c'est à toi de juger.

  • Merci Pyroh !
    J'ai déjà recherché sur Google sans succès.
    Le nombre de rapports de crash n'est pas très important.
    Je vais donc attendre et voir si une nouvelle version (sans changement sur cette partie) modifie qcq chose.

  • Bonsoir,

    Je vous donne quelles nouvelles de mon problème.
    J'ai fait une mise à jour de mon programme sans rien changer dans le code de la procédure qui avait cette erreur.
    Dans iPocket Draw, une semaine après publication, je n'ai plus de crash.
    Dans iPocket Draw Lite, 6 crashs.
    ???

  • Eric P.Eric P. Membre

    Bonjour,

    Je ressors cette discussion pour donner quelques informations qui pourraient utiles à d'autres.
    Après mon post du 7 février, les crashes sont revenus et je n'ai rien trouvé pour y remédier.
    Puis depuis mi-août, sans rien modifier, je n'ai pratiquement plus aucun de ces crashes.
    Cette fois ci j'ai attendu un peu plus longtemps avant de me réjouir.
    Je suppose que ce bug provenait d'Apple et qu'il a été corrigé.
    Bon dimanche.

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