2013-10-04 31 views
26

我有非常大的图形Mac应用程序,现在在控制台上10.9 GM上收到很多以下消息。如何检测NaN在Mac OS X上传递到CoreGraphics API的位置10.9

<Error>: Error: this application, or a library it uses, has passed an invalid numeric value (NaN, or not-a-number) to CoreGraphics API. This is a serious error and contributes to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update. 

我注意到,这些消息出现在调试器调用后[NSApp表示nextEventMatchingMask:untilDate inMode:离队]但我认为原因在其他一些地方。但是我有太多的地方使用Cocoa Graphics。 10.9之前我没有收到这种消息。

如何检测NaN传递到CoreGraphics API的位置?

Screenshot for this error on console

+0

你需要扩展你的堆栈轨迹多一点。事件派发机制是运行循环的顶层函数,而不是图形堆栈。 – CodaFi

+0

这些消息在nextEventMatchingMask之后立即出现在控制台中:看起来,错误事件在某个地方累积,然后一起显示。如何扩展图形堆栈? – Igor

+0

堆栈跟踪窗格底部有一个滑块。将它滑到最右边,然后看到哪个函数出现在轨迹的顶部。 – CodaFi

回答

63

经过大量的挖掘,我发现你可以在Xcode的“CGPostError”上设置一个符号断点,这会给你一个堆栈跟踪。

+0

太好了!有用! – Igor

+0

谢谢你好人!这节省了我几个小时的麻烦...... – Echelon

+0

太棒了!由于 – Chris

0

所以你应该在这一点得到一个异常,那么异常断点应该工作...

这里有东西看出来的......

你可能已经搞砸一个方法签名...即

-(float)myHeight 
{ 
    return 56.0; 
} 

被在子类中搞砸

-(int)myHeight 
{ 
    return 42; 
} 

,或者你有一些不好数学(S),其发出的NaN ...

有... C99推出isnan()
也是IEEE浮点招几个方法检测NaN (f != f)对于NaN将为true

+0

这实际上是一个例外吗? AFAIK,它既不是Objective-C也不是C++。你曾经可以在'CGError'上设置一个断点,但我记得在Quartz的错误消息中明确提到了这个错误(但是我之前从未有过这个特定的错误)。 (AppCode的用户:它不支持从2.1开始的符号断点 - 你必须为此使用Xcode。) –

+0

是的,我真的不知道,如果它是在这一点上的异常,我还没有在很长一段时间做iOS开发... @PeterHosey在appcode你可以访问原始GDB/LLDB提示?如果是的话,你可以设置一个断点象征......你可以在Xcode甚至建立一个与f的条件!= F(我想,但没有测试) –

+0

在AppCode,有一个调试器控制台面板,但一半时间不起作用(提示从不出现)。我不知道你的意思是“f!= f'的条件”。 –

1

我发现了这个问题。它在某个点除以零,导致NSAffineTransform与矩阵中的NaN元素。由于某些原因,编译器和操作系统在10.9之前通过这种情况

7

当我愚蠢地保留NSPopover以备将来使用时,我收到了这个错误。

看来popover.showRelativeToRect(_:)是你需要做的,然后你可以忘掉它。

+0

克里斯 - 嗨,你能解释一下如何解决目标C – NSLog

+0

这个问题对我来说,我是存储在一个静态无功的NSPopover参考中的一些观点的对象分享。看起来NSPopover似乎不喜欢在显示之后重用。根据需求重新创建popover,虽然不理想,但却做了相当的警告。打破CGPostError显示错误在NSPopover -showRelativeToRect中生成:preferredEdge: –