如何仅在某些覆盖上设置符号断点?

时间:2014-11-27 16:02:10

标签: xcode debugging swift breakpoints lldb

请考虑以下代码:

class Parent {
    func breakMethod() {
        println("p break")
    }
    func breakMethod(#variable: Int) {
        println("p breakpoint " + String(variable))
    }
}

class Child: Parent {
    override func breakMethod() {
        println("c break")
    }
    override func breakMethod(#variable: Int) {
        println("c breakpoint " + String(variable))
    }
}

let p = Parent()
let c = Child()

p.breakMethod()
c.breakMethod()
p.breakMethod(variable:0)
c.breakMethod(variable:1)

显然,实际上,这可能会更加复杂。假设我需要在实现它的每个类中调试其中一个方法。一种选择是遍历每个文件并查找breakMethod的每个实例并手动添加断点。但更好的选择是向breakMethod添加符号断点。

Xcode将负责在每个适当的位置添加断点。然后我可以手动选择和选择我想要的断点并禁用一些合适的断点。但更重要的是,只需单击一下,我就可以为此特定符号启用/禁用所有这些符号。这很方便。

但是,如果我想为breakMethod(#variable: Int)添加断点怎么办?可以这样做吗?

显然,我知道我可以为breakMethod设置它。这将抓住breakMethod的每一次覆盖。然后我就可以只启用我想要的那些。但在任何比这更复杂的情况下,这都会成为一个主要的痛苦。

在Objective-C中,我们实际上有一个看起来像这样的单独方法:

- (void)breakMethod {
    NSLog("break");
}

- (void)breakMethodVariable:(int)variable {
    NSLog("break %i", variable);
}

在这种情况下,为“breakMethod”添加符号断点只会在第一个方法上停止,我们可以为“breakMethodVariable:”添加一个单独的符号断点,该断点仅在第二个方法上停止。

但无论我做什么,在为Swift设置符号断点时,我似乎无法隔离方法覆盖。有什么我想念的吗?

为了它的价值,我尝试设置以下符号断点,但没有一个对我有效:

  • breakMethod(variable:)
  • breakMethod(variable)
  • breakMethod(#variable:)
  • breakMethod(Variable:)
  • breakMethod(Variable)
  • breakMethod(#Variable:)
  • breakMethodvariable:
  • breakMethodVariable:
  • breakMethodvariable
  • breakMethodVariable
  • breakMethodWithVariable:
  • breakMethodWithVariable
  • breakMethodWithvariable:
  • breakMethodWithvariable

我非常失望地知道在Swift中没有办法设置单独的符号断点,考虑到Objective-C中过多的不同方法的用户在很多情况下变成了一组复杂的覆盖

1 个答案:

答案 0 :(得分:3)

我不知道如何在Xcode Breakpoint导航器中执行此操作,并使它们在执行过程中保持不变。

但是,作为一种解决方法,您可以使用正则表达式断点:

(lldb) breakpoint set -r "\.breakMethod \(.+\(variable :"