Pregunta Cómo obtener parámetros utilizando puntos de interrupción simbólicos en Objective-C


Tengo un punto de ruptura que se parece a esto

-[UITableViewCell setSelected:]

y funciona, pero no puedo entender cómo obtener el valor que se está transmitiendo.

Yo he tratado -[UITableViewCell setSelected:(BOOL)what] y -[UITableViewCell setSelected:what] que no funcionan en absoluto.

¿Cómo puedo acceder a los parámetros?

Si esto no funciona, tendré que hacer una DebugUITableViewCell solo para ver qué está pasando, que es una molestia y toca mucho código.


24
2018-03-20 00:22


origen


Respuestas:


Si depura su código en el dispositivo, los parámetros cuando llegue a su punto de interrupción se encontrarán consistentemente en los registros r0, r1 y r2. Si utiliza po $r0 verá el objeto que recibe setSelected. Si utiliza po $r1 Obtendrá "sin descripción Objective-C disponible" porque ese es el selector. Inspeccione $ r2 para ver si se está seleccionando SÍ o NO. Es una historia similar en i386, pero no puedo recordar a mano qué registros se utilizan.


26
2018-03-20 01:04



En LLDB en el uso del simulador

p $arg3

para el primer parámetro


7
2018-06-12 19:09



Usted podría reemplazar -[UITableViewCell setSelected:] con su propia implementación para fines de depuración. Abajo, UITableViewCellSetSelected se llamará en lugar del método de UIKit.

static void (*__originalUITableViewCellSetSelected)( UITableViewCell *, SEL, BOOL ) ;
static void UITableViewCellSetSelected( UITableViewCell * self, SEL _cmd, BOOL b )
{
    // your code here... (or set a breakpoint here)
    NSLog(@"%@<%p> b=%s\n", [ self class ], self, b ? "YES" : "NO" ) ;

    (*__originalUITableViewCellSetSelected)( self, _cmd, b ) ; // call original implementation:
}

@implementation UITableViewCell (DebugIt)

+(void)load
{
    Method m = class_getInstanceMethod( [ self class ], @selector( setSelected: ) ) ;
    __originalUITableViewCellSetSelected = (void(*)(id, SEL, BOOL))method_getImplementation( m ) ;
    method_setImplementation( m, (IMP)UITableViewCellSetSelected ) ;
}

@end

4
2018-03-20 01:13



Residencia en -[UIApplication sendAction:toTarget:fromSender:forEvent:] símbolo podemos agregar un punto de corte simbólico para verificar qué emisor ha enviado una acción a qué objetivo.

Creamos punto de corte simbólico con:

  • símbolo: -[UIApplication sendAction:toTarget:fromSender:forEvent:]
  • acciones de línea de comando del depurador:
    • po "Target"
    • po $arg4
    • po "Sender"
    • po $arg5

La salida sería: "Target" <project.TargetViewController: 0x14ddb1470> "Sender" <UIButton: 0x14de86000; frame = (331 7; 49 30); opaque = NO; layer = <CALayer: 0x174237020>>

Entonces, como @Dan dijo, los parámetros del método comienzan con el argumento 3 (po $arg3)


1
2017-07-19 15:27