Swift 如何调试我不能经常重新创建的东西?

Swift 如何调试我不能经常重新创建的东西?,swift,debugging,ios9,xcode7,Swift,Debugging,Ios9,Xcode7,所以我已经有这个bug很长时间了,我一直无法找到它。问题是我不能经常重现它 到目前为止,我已经跟踪到了一个具体的过程,基本上是这样的 它们是三个同时进行的过程,需要不同的时间长度。完成每个过程后,它将布尔“键”设置为true,然后触发一个函数,检查所有“键”是否都已就位。基本上,一旦最后一把“钥匙”在里面,它就会真正开始做事情 在密钥设置过程中的某个地方,或更早,甚至可能在崩溃之后。不幸的是,它留下了一条非常隐晦的错误消息,当它在Xcode中崩溃时,它是“EXEC坏访问”,因此只是在应用程序委托

所以我已经有这个bug很长时间了,我一直无法找到它。问题是我不能经常重现它

到目前为止,我已经跟踪到了一个具体的过程,基本上是这样的

它们是三个同时进行的过程,需要不同的时间长度。完成每个过程后,它将布尔“键”设置为true,然后触发一个函数,检查所有“键”是否都已就位。基本上,一旦最后一把“钥匙”在里面,它就会真正开始做事情

在密钥设置过程中的某个地方,或更早,甚至可能在崩溃之后。不幸的是,它留下了一条非常隐晦的错误消息,当它在Xcode中崩溃时,它是“EXEC坏访问”,因此只是在应用程序委托声明中放置了一个断点

我相信我可以很容易地修复这个bug,我只是不知道如何修复它。谢天谢地,我有fabric,它允许我打印到一个文本文件中,当用户崩溃时,我可以看到这个文本文件。每次更新我都会向其中添加新数据(以稍微延迟为代价),以便更好地了解它是如何发生的。每一次新的碰撞都让我更接近。不幸的是,尽管我对新版本的采用率很低,而且崩溃的情况还在不断增加!我还是不知道为什么

不幸的是,这种崩溃在我的设备上只会发生一次(至少在我的设备上)。由于新版本更新率低,我不得不自己收集数据。这真的很难

我已经尝试了很多方法,试图让事情出错,或者让导致出错的过程快速发生,甚至自动按下按钮。我还是不能让它再次崩溃!当它做了所有我能做的跟踪错误是添加更多的println调用,这样我就可以看到发生了什么

奇怪的是,据我所知,我本来可以修复它的,因为我通常会尝试新的调整。但我不知道,因为它不会持续崩溃。老实说,我相当肯定我已经修复了它(或者至少降低了它发生的几率)

在这种情况下你会怎么做?

这听起来像是一场灾难


我会用它来确保所有的he任务都按顺序完成,并且在执行最后一个任务之前,所有任务都实际完成

能够重现是非常重要的——您是否尝试过添加人工/随机延迟,或使过程更快、更频繁地发生,以便更容易触发崩溃?尝试启用僵尸。还要确保在线程之间使用某种类型的同步。尝试为每个代码块(5行左右,行越少越好)向控制台打印一条消息,然后查看最后打印的消息-这会告诉您错误发生的位置。@jtbandes线程之间的同步是什么样子的?因为这可能是问题之一。因为用于检查所有三个关键点是否都到位的代码就在场景中。但是,其中一个代码将从Preload TextureWithCompletionHandler的处理程序调用它,可能导致它在第二个线程而不是第一个线程上调用3键检查?我已经看到了打印调用合并的时间。对于这种特殊情况,我建议使用dispatch_group或NSOperationQueue。