Подтвердить что ты не робот

Как получить параметры с помощью символических точек останова в Objective-C

У меня есть точка останова, которая выглядит как

-[UITableViewCell setSelected:]

и он работает, но я не могу понять, как получить значение, которое передается.

Я пробовал -[UITableViewCell setSelected:(BOOL)what] и -[UITableViewCell setSelected:what], которые вообще не работают.

Как получить доступ к параметрам?

Если это не сработает, мне нужно сделать DebugUITableViewCell только для того, чтобы увидеть, что происходит, что является проблемой и затрагивает много кода.

4b9b3361

Ответ 1

Если вы отлаживаете свой код на устройстве, параметры, когда вы нажмете свою точку останова, будут последовательно находиться в регистрах r0, r1 и r2. Если вы используете po $r0, вы увидите объект, получающий setSelected. Если вы используете po $r1, вы получите "no Objective-C description available", потому что это селектор. Осмотрите $r2, чтобы увидеть, выбрано ли выбрано значение YES или NO. Это аналогичная история на i386, но я не могу вспомнить, какие регистры используются.

Ответ 2

В LLDB на Simulator используйте

p $arg3

для первого параметра.

Ответ 3

Вы можете заменить -[UITableViewCell setSelected:] своей собственной реализацией для целей отладки. Ниже UITableViewCellSetSelected будет вызываться вместо метода 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

На основе символа -[UIApplication sendAction:toTarget:fromSender:forEvent:] мы можем добавить символическую точку останова, чтобы проверить, отправил ли отправитель действие к какой цели.

Мы создаем символическую точку останова с помощью:

  • символ: -[UIApplication sendAction:toTarget:fromSender:forEvent:]
  • Действия командной строки отладчика:
    • po "Target"
    • po $arg4
    • po "Sender"
    • po $arg5

Выход: "Target" <project.TargetViewController: 0x14ddb1470> "Sender" <UIButton: 0x14de86000; frame = (331 7; 49 30); opaque = NO; layer = <CALayer: 0x174237020>>

Так как @Dan сказал, параметры метода начинаются с аргумента 3 (po $arg3).

Ответ 5

Для методов без исходного кода работает следующее: Поместите символическую точку останова, чтобы отладчик останавливался на первой строке метода. Убедитесь, что верхняя стопка кадра выбрана. Тогда:

В методах Objectice-C

  • po $arg1 печатает самостоятельно
  • po $arg3 печатает первый аргумент, остальные аргументы в $arg4, $arg5 и т.д.

В функциях C аргументы начинаются с $arg1

Это работает как на устройстве IOS, так и на симуляторе.