Mos*_*fat 0 debugging xcode swift
我有这种情况,我有一个静态变量,它在应用程序的某个地方改变它的值,导致一个错误.没有详细介绍代码.我需要知道是否有办法观察这个变量.因为在Xcode上每次尝试观察变量它都会给我这个错误"错误:在这个框架中找不到名为'backend'的变量".
所以我的问题是,是否有任何解决方法可以知道哪个地方确实改变了这个变量的值.
除了使用手表之外的任何东西,因为由于某种原因它不能用于上述错误.
您可以向变量添加属性观察者(didSet或者willSet),并在那里设置断点并在命中断点时查看帧,或者可以记录当前线程的当前堆栈跟踪.
对于第一个示例,在属性观察器中的一个简单断点,我已经设置了以下非常简单的类:
class Observable {
static var someProperty: String? {
willSet {
print("Some property will be set.")
}
didSet {
print("Some property has been set.")
}
}
}
Run Code Online (Sandbox Code Playgroud)
有断点:
我只是从单元测试中运行此代码,但您可以在任何地方获得相同的结果.这是我用以下方法触发更改的代码:
class ObservableTests: XCTestCase {
func testObservable() {
Observable.someProperty = "foo"
Observable.someProperty = "bar"
Observable.someProperty = "baz"
}
}
Run Code Online (Sandbox Code Playgroud)
当代码运行时,我们将在断点处停在这里:
我特意将这个截图框架化了.我们看到绿线和蓝色箭头突出显示我们正在停止的断点,但是看左边.我们可以看到我们在哪个线程以及我们如何达到这个特定点.重要的是,我们可以在堆栈中向上和向下点击.
在这里,堆栈中的大多数帧只向我们展示了无用的汇编代码.如果我们查找一个框架,这就是我们所看到的:
但是如果我们再向上一帧,我们就会得到修改变量的代码:
明确地说,我点击的部分跳转到代码的不同部分,这些部分导致这个变量被设置在这里:
如上所述,打印堆栈跟踪也是一种选择,尽管效率明显较低.
如果我们改变我们willSet并且didSet看起来更像这样:
class Observable {
static var someProperty: String? {
willSet {
for symbol: String in NSThread.callStackSymbols() {
print(symbol)
}
}
didSet {
for symbol: String in NSThread.callStackSymbols() {
print(symbol)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们将能够看到日志中打印的完整堆栈跟踪,如下所示:
上面屏幕截图中的兴趣点是这两个:
2 TTDSamplesTests 0x00000001087603fa _TFC15TTDSamplesTests15ObservableTests14testObservablefS0_FT_T_ + 74
3 TTDSamplesTests 0x0000000108760492 _TToFC15TTDSamplesTests15ObservableTests14testObservablefS0_FT_T_ + 34
Run Code Online (Sandbox Code Playgroud)
它很难破译,但你可以从中挑选出部分.
_TFC15 TTDSamplesTests 15 ObservableTests 14 testObservable fS0_FT_T_
| 归档时间: |
|
| 查看次数: |
1151 次 |
| 最近记录: |