2011-04-14 15 views
5

En general, ¿cómo evitamos los bloqueos de objc_msgSend() en nuestras aplicaciones Mac? Además, ¿cómo evitamos los bloqueos EXC_BAD_ACCESS? ¿Por qué lo conseguimos? ¿Cómo podemos manejar este tipo de errores? Están en aumento en nuestra aplicación y le gustaría pedir orientación y ayuda en este asunto.objc_msgSend() y EXC_BAD_ACCESS en la aplicación de cacao

Estamos utilizando XCode 3.2.5 y nuestro proyecto es Cocoa uno, utilizando el lenguaje Objective-C. Nuestro servicio web es un sitio web ASP.Net impulsado por IIS (desde donde podemos descargar/cargar archivos e imágenes XML).

Estamos desarrollando una aplicación Cocoa en Mac, y nos encontramos con esto como dos veces en diez intentos de lanzamiento de la aplicación. Esta aplicación tiene una aplicación de boceto, y cuando ejecutamos la aplicación, simplemente se congela y se cuelga en 1 minuto sin hacer nada. Algunas funciones de esta aplicación hace es:

  • descarga XML desde web e interpretan en nuestra aplicación
  • de acceso a un servicio web
  • tiene un bloc de dibujo
  • tiene un temporizador
  • funciones de arrastrar y soltar
  • datos XML de carga
  • imágenes de descarga y visualización en nuestra aplicación

El bloqueo no se limita al post-lanzamiento de la aplicación. A veces, al manipular el programa como arrastrar y soltar, descargar el conjunto de datos y hacer funciones de agregar/editar/eliminar en nuestra aplicación Mac, la aplicación también se cuelga.

Honestamente hablando, somos relativamente nuevos en esta plataforma y entorno de desarrollo, y aún estamos aprendiendo. ¿Nos puede guiar en este tema? Al igual que algunos recursos o pistas sobre dónde lo hicimos mal? Muchas gracias y más poder a todos aquí.


El folowing es un ejemplo de un informe de bloqueo:

Process:   Sketch [63065] 
Path:   /Users/william_hooley_27Inch/Desktop/untitled folder/MacGlass.app/Contents/MacOS/Sketch 
Identifier:  com.apple.CocoaExamples.Sketch 
Version:   1.049 (48.1) 
Code Type:  X86 (Native) 
Parent Process: launchd [116] 
Date/Time:  2011-04-14 13:12:15.421 +1000 
OS Version:  Mac OS X 10.6.5 (10H574) 
Report Version: 6 
Interval Since Last Report:   714907 sec 
Crashes Since Last Report:   17 
Per-App Interval Since Last Report: 206437 sec 

Per-App Crashes Since Last Report: 5 
Anonymous UUID:      
086C860F-E28E-4256-84F9-9692782AAD01 
Exception Type: EXC_BAD_ACCESS 
(SIGBUS) Exception Codes: 
KERN_PROTECTION_FAILURE at 
0x0000000000000044 Crashed Thread: 0 
Dispatch queue: com.apple.main-thread 
Thread 0 Crashed: Dispatch queue: 
com.apple.main-thread 0 
com.apple.AppKit    
0x91a8e6cb 
_recursiveInvalidateCachedVisibleRectValue 
+ 24 1 com.apple.CoreFoundation  0x995f02c0 CFArrayApplyFunction + 224 
2 com.apple.AppKit    
0x91a8e70d 
_recursiveInvalidateCachedVisibleRectValue 
+ 90 3 com.apple.CoreFoundation  0x995f02c0 CFArrayApplyFunction + 224 
4 com.apple.AppKit    
0x91a8e70d 
_recursiveInvalidateCachedVisibleRectValue 
+ 90 5 com.apple.CoreFoundation  0x995f02c0 CFArrayApplyFunction + 224 
6 com.apple.AppKit    
0x91a8e70d 
_recursiveInvalidateCachedVisibleRectValue 
+ 90 7 com.apple.CoreFoundation  0x995f02c0 CFArrayApplyFunction + 224 
8 com.apple.AppKit    
0x91a8e70d 
_recursiveInvalidateCachedVisibleRectValue 
+ 90 9 com.apple.CoreFoundation  0x995f02c0 CFArrayApplyFunction + 224 
10 com.apple.AppKit    
0x91a8e70d 
_recursiveInvalidateCachedVisibleRectValue 
+ 90 11 com.apple.CoreFoundation  0x995f02c0 CFArrayApplyFunction + 224 
12 com.apple.AppKit    
0x91a8e70d 
_recursiveInvalidateCachedVisibleRectValue 
+ 90 13 com.apple.CoreFoundation  0x995f02c0 CFArrayApplyFunction + 224 
14 com.apple.AppKit    
0x91a8e70d 
_recursiveInvalidateCachedVisibleRectValue 
+ 90 15 com.apple.AppKit    0x91a8e2e1 -[NSView _setSuperview:] + 
684 16 com.apple.AppKit    
0x91a8db02 -[NSView addSubview:] + 383 
17 com.apple.CocoaExamples.Sketch 
0x00094cbf -[viewTasksDisplay Appear:] 
+ 242 18 com.apple.CocoaExamples.Sketch 
0x000c2e8f -[MainWindow 
ShowLeftScreen:] + 964 19 
com.apple.CocoaExamples.Sketch 
0x0003e301 -[viewOptionMenuItemmouseDown:] + 2055 20 
com.apple.AppKit    
0x91bc6c68 -[NSWindow sendEvent:] + 
5549 21 com.apple.AppKit    
0x91adf817 -[NSApplication sendEvent:] 
+ 6431 22 com.apple.AppKit    0x91a732a7 -[NSApplication run] + 917 
23 com.apple.AppKit    
0x91a6b2d9 NSApplicationMain + 574 24 
com.apple.CocoaExamples.Sketch 
0x0001b33e main + 30 25 
com.apple.CocoaExamples.Sketch 
0x00001eba start + 54 Thread 1: 
Dispatch queue: 
com.apple.libdispatch-manager 0 
libSystem.B.dylib    
0x98002982 kevent + 10 1 
libSystem.B.dylib    
0x9800309c _dispatch_mgr_invoke + 215 
2 libSystem.B.dylib    
0x98002559 _dispatch_queue_invoke + 
163 3 libSystem.B.dylib    
0x980022fe _dispatch_worker_thread2 + 
240 4 libSystem.B.dylib    
0x98001d81 _pthread_wqthread + 390 5 
libSystem.B.dylib    
0x98001bc6 start_wqthread + 30 Thread 
2: 0 libSystem.B.dylib    
0x97fdc0fa mach_msg_trap + 10 1 
libSystem.B.dylib    
0x97fdc867 mach_msg + 68 2 
com.apple.CoreFoundation  
0x995f837f __CFRunLoopRun + 2079 

Otro informe de bloqueo:

Date/Time:  2011-04-14 13:27:02 
+1000 OS Version:  10.6.5 (Build 10H574) Architecture: x86_64 Report 
Version: 6 Command:   MacGlass 
Path:   
/Users/william_hooley_27Inch/Desktop/untitled 
folder/MacGlass.app/Contents/MacOS/Sketch 
Version:   1.050 (48.1) Parent: 
launchd [116] PID:    63101 
Event:   hang Duration:  
3.58s (sampling started after 2 seconds) Steps:   16 (100ms 
sampling interval) Pageins:   0 
Pageouts:  0 Process:   
Sketch [63101] Path:   
/Users/william_hooley_27Inch/Desktop/untitled 
folder/MacGlass.app/Contents/MacOS/Sketch 
UID:    501 Thread edef3d4 
DispatchQueue 100 User stack: 
    16 start + 54 (in Sketch) [0x1f6a] 
     16 main + 30 (in Sketch) [0x1b3ee] 
     16 NSApplicationMain + 574 (in AppKit) [0x91a6b2d9] 
      16 -[NSApplication run] + 821 (in AppKit) [0x91a73247] 
      16 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] 
+ 156 (in AppKit) [0x91ab0fce] 
       16 _DPSNextEvent + 847 (in AppKit) [0x91ab178d] 
       16 BlockUntilNextEventMatchingListInMode 
+ 81 (in HIToolbox) [0x95bd0bd6] 
        16 ReceiveNextEventCommon + 354 (in 
HIToolbox) [0x95bd0d51] 
        16 RunCurrentEventLoopInMode + 392 (in 
HIToolbox) [0x95bd0f9c] 
         16 CFRunLoopRunInMode + 97 (in 
CoreFoundation) [0x995f7291] 
         16 CFRunLoopRunSpecific + 452 (in 
CoreFoundation) [0x995f7464] 
          16 __CFRunLoopRun + 8059 (in CoreFoundation) [0x995f9adb] 
          16 __NSFireTimer + 141 (in Foundation) [0x972c39b0] 
           16 _handleWindowNeedsDisplay + 696 (in AppKit) [0x91adb28a] 
           16 -[NSWindow displayIfNeeded] + 204 (in AppKit) [0x91aa9d40] 
            16 -[NSView displayIfNeeded] + 818 (in AppKit) [0x91ae0a57] 
            16 -[NSView _displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:] 
+ 4122 (in AppKit) [0x91b801cf] 
             16 CAViewEndDraw + 134 (in QuartzCore) 
[0x961bd926] 
             16 pthread_cond_wait$UNIX2003 + 73 (in 
libSystem.B.dylib) [0x9800b9f8] 
              16 __semwait_signal + 10 (in 
libSystem.B.dylib) [0x9800a0a6] 
Kernel stack: 
    15 semaphore_wait_continue + 0 [0x22a3dd] 
    1 lo_alltraps + 454 [0x2a08a6] 
     1 i386_astintr + 47 [0x2a9a9a] 
     1 ast_taken + 247 [0x219107] 
      1 bsd_ast + 806 [0x489088] 
      1 postsig + 432 [0x4861df] 
       1 exit1 + 449 [0x47ab28] 
       1 task_terminate_internal + 315 
[0x22c56a] 
+0

Y una razón común para 'EXC_BAD_ACCESS' es manageme memoria incorrecta Nuevo Testamento. ¿Utiliza la recolección de basura en su aplicación? –

+0

Recomiendo leer: [Por lo que se estrelló en objc_msgSend()] (http://www.sealiesoftware.com/blog/archive/2008/09/22/objc_explain_So_you_crashed_in_objc_msgSend.html) –

Respuesta

4

La causa habitual de algo como esto es sobre la liberación de los objetos. Si ejecuta su código con NSZombieEnabled, la salida de la consola le dará una pista sobre dónde buscar.

Alternativamente, si se trata de una aplicación Macintosh dirigida a 10.5 o superior, puede habilitar la recolección de basura y no preocuparse por retener y liberar.

0

Acabo de resolver un EXC_BAD_ACCESS en objc_msgSend encontrando dónde estaría sobreescritos el final de una cadena, corrompiendo el objeto en el almacenamiento ....

2

El segundo informe de bloqueo no es un accidente, eso es un informe hang . Eso significa que tu aplicación fue lenta, no se colgó.

En general, lea y comprenda completamente las pautas de Cocoa Memory Management; los errores en la administración de la memoria representan la gran mayoría de los bloqueos en las aplicaciones de Cocoa.La guía se puede encontrar aquí: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

También debería poder utilizar herramientas como el depurador Xcode y la herramienta Zombies en Instruments para recopilar información más detallada sobre bloqueos.

3

Cuando se produce este error en una aplicación para iOS en un dispositivo conectado con el depurador puede averiguar el selector de ser llamado escribiendo en la consola de depuración

(BGF) x/s $ r1

Esto me ayudó a encontrar un problema cuando el acelerómetro tenía su delegado todavía configurado en un objeto desasignado. Tal vez esta información sea útil para otros.

+2

! [Enter image description here] [1 ] [1]: http://i.stack.imgur.com/otnqT.png ¿Lo estoy haciendo mal? –

+0

La respuesta anterior fue para gdb, pero de su captura de pantalla está claro que está utilizando lldb (que es el depurador predeterminado desde XCode 4.3). La información sobre cómo usar lldb se puede encontrar aquí: http://lldb.llvm.org/tutorial.html – emidander

+0

$ r1 no es el registro que explotó para mí con iOS 8. Uno debe mirar el seguimiento de la pila como las cosas cambian – clearlight

0

que fue capaz de encontrar el selector problemática con LLDB, pero el enfoque era diferente para mí de lo descrito por la respuesta anterior utilizando la semántica del BGF y una versión anterior de iOS (actualmente estoy trabajando con iOS 8)

Mi seguimiento de la pila empezó así:

libobjc.A.dylib`objc_msgSend: 
0x10c160000: testq %rdi, %rdi 
0x10c160003: jle 0x10c160068  ; objc_msgSend + 104 
0x10c160005: movq (%rdi), %r11 
0x10c160008: movq %rsi, %r10 
0x10c16000b: andl 0x18(%r11), %r10d <== EXC_BAD_ACCESS 

en el símbolo LLDB, hice lo siguiente:

(lldb) register read -G s r10 
    r10 = "\xffffffc16\xffffffa4\t\x01" "isKindOfClass:" 
Cuestiones relacionadas