2013-10-04 7 views
26

Ich habe sehr große Grafik-Mac-App und jetzt bekomme ich eine Menge der folgenden Nachrichten in der Konsole auf 10.9 GM.Wie erkennen, wo NaN zu CoreGraphics API unter Mac OS X 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. 

bemerkte ich, dass diese Nachrichten in Debugger erscheinen nach dem Aufruf von [NSApp nextEventMatchingMask: untilDate INMODE: dequeue] aber ich denke, die Gründe in einigen anderen Orten sind. Aber ich habe zu viele Orte, an denen ich Cocoa Graphics verwende. Ich habe diese Art von Nachricht nicht vor 10.9 erhalten.

Wie erkennen, wo NaN an CoreGraphics API übergeben?

Screenshot for this error on console

+0

Sie müssen Ihre Stack-Spuren etwas erweitern. Der Ereignisversendungsmechanismus ist eine Funktion der obersten Ebene der Ausführungsschleife, nicht der Grafikstapel. – CodaFi

+0

Diese Nachrichten werden sofort nach dem nächsten Schritt in der Konsole angezeigt nextEventMatchingMask :. Es scheint, Fehlerereignisse irgendwo angesammelt und dann zusammen angezeigt werden. Wie kann man den Grafikstapel erweitern? – Igor

+0

Am unteren Rand des Stack-Trace-Bereichs befindet sich ein Schieberegler. Schieben Sie es so weit wie möglich nach rechts und sehen Sie, welche Funktion oben auf der Kurve angezeigt wird. – CodaFi

Antwort

63

Nach viel herumgraben, ich habe gefunden, dass Sie einen symbolischen Haltepunkt auf "CGPostError" in Xcode einstellen können, und das Ihnen eine Stapelspur geben wird.

+0

Großartig! Es klappt! – Igor

+0

Danke, guter Mann! Das hat mir viele Stunden Ärger erspart ... – Echelon

+0

Super! Danke – Chris

0

so sollten Sie eine Ausnahme an diesem Punkt erhalten, also eine Ausnahme Haltepunkt sollte funktionieren ...

hier sind die Dinge zu achten ist ...

Sie verwirrt haben up eine Methodensignatur ... dh

-(float)myHeight 
{ 
    return 56.0; 
} 

wird in einer Unterklasse

verkorkste
-(int)myHeight 
{ 
    return 42; 
} 

oder Sie haben einige schlechte Mathe (n), die ein NaN emittieren ...

gibt es ein paar Möglichkeiten, um eine NaN ... c99 eingeführt zu erkennen isnan()
auch die ieee Schwimmer Trick (f != f) gilt für NaN

+0

Ist das tatsächlich eine Ausnahme? AFAIK, es ist weder Objective-C noch C++. Früher war es möglich, einen Haltepunkt auf 'CGError' zu setzen, obwohl ich mich erinnere, dass dies in den Fehlermeldungen von Quartz explizit erwähnt wurde (aber ich hatte diesen spezifischen Fehler vorher nie). (Benutzer von AppCode: Es unterstützt keine symbolischen Breakpoints ab Version 2.1 - Sie müssen dafür Xcode verwenden.) –

+0

yeah Ich weiß nicht, ob es eine Ausnahme zu diesem Zeitpunkt ist, habe ich nicht iOS Entwicklung seit langer Zeit gemacht ... @PeterHosey in Appcode erhalten Sie Zugriff auf die rohen gdb/lldb Prompt? Wenn ja, können Sie einen symbolischen Haltepunkt setzen ... Sie könnten in xcode sogar einen setzen mit einer Bedingung von f! = f (ich stelle mir vor, aber habe nicht getestet) –

+0

In AppCode gibt es einen Debugger Konsolenbereich, aber die Hälfte der Mal funktioniert es nicht (Prompt erscheint nie). Ich weiß nicht, was du unter "Bedingung von f! = F" meinst. –

1

Ich habe das Problem gefunden. Es wird irgendwann durch Null geteilt, was zu NSAffineTransform mit NaN-Elementen in der Matrix führt. Aus einigen Gründen haben Compiler und OS diese Situation vor 10.9 bestanden.

7

Ich bekam diesen Fehler, als ich einen NSPopover für zukünftige Verwendung töricht behielt.

Es scheint popover.showRelativeToRect(_:) ist alles was Sie tun müssen, und dann können Sie es vergessen.

+0

Hallo Chris, können Sie bitte erklären, wie dieses Problem in objective c – NSLog

+0

zu beheben In meinem Fall war ich eine NSPopover Referenz in einer statischen var speichern, um unter einer Reihe von Ansicht Objekte zu teilen . Es sieht so aus, als ob NSPopover nicht gerne wiederverwendet wird, sobald es gezeigt wurde. Das Popover auf Nachfrage neu zu erstellen, obwohl es nicht ideal war, hat die Warnung ausgesprochen. Breaking on CGPostError zeigt, dass der Fehler in NSPopover -showRelativeToRect generiert wird: preferredEdge: –