Подтвердить что ты не робот

Как определить, где NaN переходит в CoreGraphics API в Mac OS X 10.9

У меня очень большое графическое приложение для Mac, и теперь я получаю много следующих сообщений в консоли на 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: dequeue], но я думаю, что причины находятся в некоторых других местах. Но у меня слишком много мест, где я использую Cocoa Graphics. Я не получал такого сообщения до 10.9.

Как определить, где NaN переходит к API CoreGraphics?

Снимок экрана для этой ошибки на консоли

4b9b3361

Ответ 1

После многократного поиска я обнаружил, что вы можете установить символическую точку останова на "CGPostError" в Xcode, и это даст вам трассировку стека.

Ответ 2

Я получал эту ошибку, когда я глупо сохранял NSPopover для будущего использования.

Кажется, что popover.showRelativeToRect(_:) - это все, что вам нужно сделать, а затем вы можете забыть об этом.

Ответ 3

Я нашел проблему. Он делит на нуль в какой-то момент, что приводит к NSAffineTransform с элементами NaN в матрице. По некоторым причинам компилятор и ОС передали эту ситуацию до 10.9.

Ответ 4

поэтому вы должны получить исключение в этой точке, поэтому контрольная точка исключения должна работать...

вот что нужно искать...

возможно, вы испортили подпись метода... т.е.

-(float)myHeight
{
    return 56.0;
}

запутался в подклассе

-(int)myHeight
{
    return 42;
}

или у вас есть плохая математика (ы), которые испускают NaN...

существует несколько способов обнаружения NaN... c99 введено isnan()
также т.п. т.п. (f != f) будет истинным для NaN