xcode gdb nsarray lldb

xcode - Punto de corte de excepción simbólica en-



gdb nsarray (2)

NSRangeException no es una clase:

grep NSRangeException /System/Library/Frameworks/Foundation.framework/Headers/NSException.h FOUNDATION_EXPORT NSString * const NSRangeException;

Resulta que las excepciones de rango son simplemente NSExceptions cuyo nombre es NSRangeException, es decir:

(lldb) b s -n objc_exception_throw Breakpoint 2: where = libobjc.A.dylib`objc_exception_throw, address = 0x00007fff8e3c2e4a (lldb) c Process 58216 resuming Process 58216 stopped * thread #1: tid = 0x1d7f4b, function: objc_exception_throw , stop reason = breakpoint 2.1 frame #0: 0x00007fff8e3c2e4a libobjc.A.dylib`objc_exception_throw libobjc.A.dylib`objc_exception_throw: -> 0x7fff8e3c2e4a: pushq %rbp 0x7fff8e3c2e4b: movq %rsp, %rbp 0x7fff8e3c2e4e: pushq %r15 0x7fff8e3c2e50: pushq %r14 (lldb) bt * thread #1: tid = 0x1d7f4b, function: objc_exception_throw , stop reason = breakpoint 2.1 frame #0: 0x00007fff8e3c2e4a libobjc.A.dylib`objc_exception_throw frame #1: 0x00007fff841ca1df CoreFoundation`-[__NSArrayI objectAtIndex:] frame #2: 0x0000000100000eb9 range-exception`-[Foo throwIt] at range-exception.m:14 frame #3: 0x0000000100000f27 range-exception`main at range-exception.m:22 frame #4: 0x00007fff8468d5fd libdyld.dylib`start frame #5: 0x00007fff8468d5fd libdyld.dylib`start (lldb) expr (NSString *) [((NSException *) $arg1) name] (NSString *) $0 = 0x00007fff74177990 @"NSRangeException"

De modo que podría establecer un punto de interrupción en objc_exception_throw y escribir una condición de punto de interrupción comparando el nombre con NSRangeException. Algo como:

[(NSString *) [((NSException *) $arg1) name] isEqual: (NSString *) NSRangeException]

debería hacer el truco.

Agregar un punto de corte simbólico en Xcode le da una plantilla de ejemplo de -[NSException raise] . Quiero hacer lo mismo, pero específicamente en -[NSRangeException raise] . El motivo es que quiero establecer un punto de corte solo en excepciones de límites de matriz específicos, por ejemplo:

*** Terminating app due to uncaught exception ''NSRangeException'', reason: ''*** -[__NSArrayI objectAtIndex:]: index 31 beyond bounds [0 .. 30]''

Sí, sé que puedo agregar un punto de interrupción de excepción. Sin embargo, no quiero hacer eso ya que no quiero romper el punto de las muchas excepciones generadas durante el uso de la aplicación.

He intentado bastantes cosas basadas en otras publicaciones relacionadas con NSException . Sin embargo, no he encontrado nada que funcione con éxito todavía.

Por ejemplo, intenté:

Esta entrada en el diario también fue de interés, aunque no concluyente:

Tratar con NSArray "fuera de límites"

Entonces, básicamente, la pregunta es, en Xcode, ¿cómo hacer un punto de corte específicamente y solo en una excepción de rango?


Para crear un punto de interrupción para NSRangeException , use un punto de interrupción de excepción. Es una de las opciones cuando hace clic en "+" en el navegador de punto de interrupción. Encontré esta información de esta respuesta: https://.com/a/9718552/591487