web-dev-qa-db-ja.com

Mac OS X10.9でNaNがCoreGraphicsAPIに渡されている場所を検出する方法

私は非常に大きなグラフィックMacアプリを持っていますが、10.9GMのコンソールで次のメッセージをたくさん受け取ります。

<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:dequeue]を呼び出した後、これらのメッセージがデバッガーに表示されることに気付きましたが、理由は他の場所にあると思います。しかし、CocoaGraphicsを使用する場所が多すぎます。私は10.9以前にこの種のメッセージを受け取りませんでした。

NaNがCoreGraphicsAPIに渡されている場所を検出する方法は?

Screenshot for this error on console

38
Igor

よく調べてみると、Xcodeの「CGPostError」にシンボリックブレークポイントを設定できることがわかりました。これにより、スタックトレースが得られます。

91
Tom Dalling

将来の使用のためにNSPopoverを愚かに保持していたときに、このエラーが発生していました。

popover.showRelativeToRect(_:)だけで十分なようですが、それを忘れることができます。

7
Chris

私は問題を見つけました。ある時点でゼロ除算を行うと、マトリックス内にNaN要素を持つNSAffineTransformが発生します。いくつかの理由で、コンパイラとOSは10.9より前にこの状況を通過しました。

1
Igor

その時点で例外を取得する必要があるため、例外ブレークポイントが機能するはずです...

ここに注意すべきことがあります...

メソッドシグネチャを台無しにした可能性があります...つまり

_-(float)myHeight
{
    return 56.0;
}
_

サブクラスでめちゃくちゃになる

_-(int)myHeight
{
    return 42;
}
_

または、NaNを放出するいくつかの悪い数学があります...

naNを検出する方法はいくつかあります... c99が導入されましたisnan()
また、_(f != f)_のieeeフロートトリックはNaNにも当てはまります

0
Grady Player