如何在Objective-C中使用符号断点获取参数

Dan*_*ark 31 debugging xcode objective-c lldb

我有一个看起来像这样的断点

-[UITableViewCell setSelected:]
Run Code Online (Sandbox Code Playgroud)

它工作,但我无法弄清楚如何获得传递的值.

我曾尝试-[UITableViewCell setSelected:(BOOL)what]-[UITableViewCell setSelected:what]不工作在所有.

如何访问参数?

如果这不起作用,我将不得不做一个DebugUITableViewCell公正的事情,看看发生了什么,这是一个麻烦,触及了很多代码.

Aar*_*den 29

如果在设备上调试代码,则在达到断点时的参数将始终位于寄存器r0,r1和r2中.如果您使用,po $r0您将看到接收setSelected的对象.如果你使用po $r1你将得到"没有Objective-C描述可用"因为那是选择器.检查$ r2以查看是否将所选项设置为YES或NO.这是关于i386的类似故事,但我不记得手头使用了哪些寄存器.

  • 它可以与lldb一起使用.实际上,它在lldb中更好,因为(对于在寄存器中传递参数的体系结构,如arm和x86_64),提供了`$ arg0`,`$ arg1`等,它们是该体系结构的正确寄存器的别名. (12认同)
  • 在lldb中访问以$ arg1开头的参数.对于方法调用,第一个用户参数是$ arg3; 因此,如果第一个方法参数是一个NSString只是`po $ arg3`来显示它. (11认同)
  • 试图记录一个`CGPoint`参数,但`p(CGPoint)$ arg3`不起作用. (2认同)

Dan*_*ark 13

在LLDB上模拟器使用

p $arg3

对于第一个参数.


nie*_*bot 5

您可以将-[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
Run Code Online (Sandbox Code Playgroud)