Только странный сбой в симуляторе iPad (<= 4.3) (EXC_BAD_ACCESS) - есть идеи? - PullRequest
0 голосов
/ 24 октября 2011

Иногда я получаю действительно странный сбой только на симуляторе (<= 4.3). Это происходит, когда я нажимаю кнопку на контроллере навигации, встроенном в поповер. Под поповером есть EAGLView, который что-то рендерит. Память обрабатывается должным образом и т. Д. ... на устройстве вообще никаких проблем. </p>

Есть идеи?

Вот стек вызовов:

* thread #1: tid = 0x2c03, 0x00ab6707 CoreGraphics`CGColorGetAlpha + 17, stop reason = EXC_BAD_ACCESS (code=1, address=0x1cc9b72c)
frame #0: 0x00ab6707 CoreGraphics`CGColorGetAlpha + 17
frame #1: 0x00dc9871 QuartzCore`-[CALayer _renderBackgroundInContext:] + 97
frame #2: 0x00dc97af QuartzCore`-[CALayer renderInContext:] + 977
frame #3: 0x00dcf15c QuartzCore`-[CALayer _renderSublayersInContext:] + 444
frame #4: 0x00dc97e1 QuartzCore`-[CALayer renderInContext:] + 1027
frame #5: 0x00dcf15c QuartzCore`-[CALayer _renderSublayersInContext:] + 444
frame #6: 0x00dc97e1 QuartzCore`-[CALayer renderInContext:] + 1027
frame #7: 0x003434a9 UIKit`-[UIView(Internal) _renderSnapshotWithRect:inContext:] + 790
frame #8: 0x0067776d UIKit`-[UIClipCornerView _updateSnapshot] + 697
frame #9: 0x0067723c UIKit`-[UIRoundedCornerView didMoveToSuperview] + 51
frame #10: 0x0033c750 UIKit`-[UIView(Internal) _addSubview:positioned:relativeTo:] + 1080
frame #11: 0x0033aaa3 UIKit`-[UIView(Hierarchy) addSubview:] + 57
frame #12: 0x004df1ad UIKit`-[UILayoutContainerView _beginFastMode] + 259
frame #13: 0x003c0c74 UIKit`-[UIViewController(UINavigationControllerItem) setEditing:animated:] + 249
frame #14: 0x0051453b UIKit`-[UITableViewController setEditing:animated:] + 73
frame #15: 0x003b6d1e UIKit`-[UIViewController(UINavigationControllerItem) _toggleEditing:] + 77
frame #16: 0x0030b4fd UIKit`-[UIApplication sendAction:to:from:forEvent:] + 119
frame #17: 0x0051dcc3 UIKit`-[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 156
frame #18: 0x0030b4fd UIKit`-[UIApplication sendAction:to:from:forEvent:] + 119
frame #19: 0x0039b799 UIKit`-[UIControl sendAction:to:forEvent:] + 67
frame #20: 0x0039dc2b UIKit`-[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
frame #21: 0x0039c7d8 UIKit`-[UIControl touchesEnded:withEvent:] + 458
frame #22: 0x0032fded UIKit`-[UIWindow _sendTouchesForEvent:] + 567
frame #23: 0x00310c37 UIKit`-[UIApplication sendEvent:] + 447
frame #24: 0x00315f2e UIKit`_UIApplicationHandleEvent + 7576
frame #25: 0x018f0992 GraphicsServices`PurpleEventCallback + 1550
frame #26: 0x00f79944 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
frame #27: 0x00ed9cf7 CoreFoundation`__CFRunLoopDoSource1 + 215
frame #28: 0x00ed6f83 CoreFoundation`__CFRunLoopRun + 979
frame #29: 0x00ed6840 CoreFoundation`CFRunLoopRunSpecific + 208
frame #30: 0x00ed6761 CoreFoundation`CFRunLoopRunInMode + 97
frame #31: 0x018ef1c4 GraphicsServices`GSEventRunModal + 217
frame #32: 0x018ef289 GraphicsServices`GSEventRun + 115
frame #33: 0x00319c93 UIKit`UIApplicationMain + 1160

Еще одна вещь, которая кажется важной: когда скрытый EAGLView скрыт, это не происходит. GLView и Popover не делятся никакими данными - интересно, не так ли? Я подозреваю, что это происходит, когда нажатая кнопка («edit») хочет перерисовать / переключить на «blue», тогда происходит некоторое смешивание, так как заголовок popover является своего рода полупрозрачным. Для меня это звучит как проблема с симулятором; у кого-нибудь было что-нибудь подобное?

Спасибо за любой ответ,

1012 * з.д. *

Ответы [ 2 ]

2 голосов
/ 24 октября 2011

Установить NSZombieEnabled , MallocStackLogging и guard malloc в отладчике. Затем, когда ваше приложение вылетает, введите в консоли gdb:

(gdb) info malloc-history 0x543216

Замените 0x543216 адресом объекта, вызвавшего сбой (вероятно, из этой строки: * thread #1: tid = 0x2c03, 0x00ab6707 CoreGraphics CGColorGetAlpha + 17, stop reason = EXC_BAD_ACCESS (code=1, address=0x1cc9b72c)), и вы получите гораздо более полезную трассировку стека, и она должна помочь вам точно определить строку в вашем коде, которая вызывает проблему.

См. Эту статью для более подробных инструкций.

0 голосов
/ 26 октября 2011

GDB дает мне что-то вроде этого:

    Alloc: Block address: 0x12387ff0 length: 16
    Stack - pthread: 0xa0014540 number of frames: 38
        0: 0x5fb8e in GMmalloc_zone_malloc_internal
        1: 0x5fd31 in GMmalloc_zone_malloc
        2: 0x60327 in GMmalloc_zone_calloc
        3: 0x60375 in GMcalloc
        4: 0x132a2d4 in class_createInstance
        5: 0xec65d8 in +[NSObject(NSObject) allocWithZone:]
        6: 0x48218e in +[UIColor allocWithZone:]
        7: 0xec63da in +[NSObject(NSObject) alloc]
        8: 0x4812c6 in +[UIColor clearColor]
        9: 0x15b1d in -[EAGLView initWithCoder:]

Как мы видим, EAGLView задействован ...

... и на самом деле после некоторого копания я понял, что проблема быладелать с цветом фона EAGLLayer.Я объявил это следующим образом:

    eaglLayer.backgroundColor = (CGColorRef) [UIColor clearColor];

До тех пор это обычно работало нормально.

Я исправил это с помощью:

    CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
    const CGFloat clearColor[] = {0.0, 0.0, 0.0, 0.0};
    eaglLayer.backgroundColor = CGColorCreate(rgb, clearColor);
    CGColorSpaceRelease(rgb); 

или короче:

    eaglLayer.backgroundColor = [UIColor clearColor].CGColor;

С тех пор не исключение.

@ chown: спасибо за ваш совет.

wl

...