Frage

ich ein ziemlich seltsames Problem in meinem iPhone-App habe, das ist, glaube ich, in den Speichern im Zusammenhang beschädigt zu werden:

An einem Punkt muss ich ein Array sortieren, die ich mit -[sortArrayUsingFunction] tun.

Das Ergebnis ist nicht korrekt, wenn ich entweder etwas Speicher mit so etwas wie void *test = malloc(2 * sizeof( int )) vor dem Aufruf Methode zuweisen oder habe, beispielsweise ein Aufruf an NSLog() (die nie aufgerufen wird) in der Sortierfunktion.

Mit anderen Worten: Die Sortierung funktioniert nur, wenn ich etwas den Speicher erhöhen, die vor dem Aufruf der Sortierfunktion verwendet wurde. Ich denke, das liegt daran, dass an einem gewissen Punkt, Speicher beschädigt werden.

Wie debuggen Sie so etwas wie das?

War es hilfreich?

Lösung

Es klingt wie einige Ihren Code verwenden bereits Objekte freigegeben. Viel Hilfe bei der Fehlersuche, diese Art von Fehler in Apples großen Mac bereitgestellt OS X Debuggen Magie Tech-Note, vor allem der Stiftung Teil.

Für Ihren Fall würde ich Autorelease-Pools deaktivieren (der Umgebungsvariable NSEnableAutoreleasePool=NO Einstellung) oder die Zombie-Funktion (NSZombieEnabled=YES) zu finden, wo Sie Nachrichten freigegeben Objekte senden.

Andere Tipps

Versuchen Sie Ihr Programm im Simulator unter Valgrind ausgeführt wird:

http://valgrind.org/

Und wie es unter dem Simulator verwenden:

http://landonf.bikemonkey.org/code/iphone/iPhone_Simulator_Valgrind .20081224.html

Sie müssen möglicherweise den valgrind Pfad im Codebeispiel ändern, je nachdem, wo es installiert wird.

Eine solche Dinge kann eine Herausforderung zu debuggen. Es gibt einige Werkzeuge zur Erfassung out-of-bounds Zugriffe und solche auf anderen Plattformen, so nehme ich an etwas für das iPhone wäre, aber ich weiß nicht, irgend.

Vielleicht sollten Sie speichern zwei Kopien des Arrays, und vergleichen sie für Unterschiede. Drucken Sie die Unterschiede. Die Art des „Junk“, die zu einem der Anordnungen eingeführt wurden, könnte einen Hinweis geben, wo es herkommt.

Auch gehen Sie einfach den Code durch, die vor diesem Punkt läuft, und wieder lesen sie (oder besser noch, jemand anderes, es zu lesen). Vielleicht haben Sie einen Fehler entdecken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top