iOS libsystem_c.dylib stradd Speicherverlust NSZombie funktioniert nicht

8

Bitte helfen Sie mir, ein iOS-Speicherleck aufzuspüren. Danke!

Ich benutze xCode 4.0.1 und ich habe versucht, NSZombie zu aktivieren, um ein Speicherleck zu verfolgen, aber es scheint mit xCode 3.x

nicht wie zuvor zu funktionieren

Ich kann nicht herausfinden, woher das Speicherleck kommt, wie Instruments dies hervorhebt:

Durchgesickertes Objekt - & gt; GeneralBlock-32 Adresse - & gt; 0x4c8600 Größe - & gt; 32 Bytes Verantwortliche Bibliothek - & gt; libsystem_c.dylib Verantwortlicher Rahmen / Anrufer - & gt; strup

An dieser Stelle weiß ich nicht, ob ich Instrumente mit NSZombie richtig mit xCode 4 verwende, da es die NSZombie-Option nicht anzeigt, wenn ich auf "i" klicke, um mehr zu sehen Informationen, unter der linken Option Lecks .

BEOBACHTUNG : Meine iPhone-Anwendung spielt einen Live-Stream MMS / WMA und auch WMA-Audio-Dateien mit einer endlichen Menge an Zeit. Das Leck passiert nur mit einer endlichen wma-Datei, aber läuft perfekt , wenn ich von einer gestreamten Quelle ohne Endzeit spiele.

    
Winston 05.05.2011, 14:30
quelle

2 Antworten

10

Erstens ist das ein malloc -Block, kein Objekt. Zombies werden nicht funktionieren (und hätten auch nie in früheren Versionen funktioniert).

Wie oft passiert dieses Leck? Einmal? Mach dir keine Sorgen darüber. Einmal pro Stream? Einen Bug einreichen - das ist nicht in deinem Code von dem, was du bisher gepostet hast (außer dein Code ruft strdup auf, was sicherlich möglich ist, aber untypisch in den meisten iOS-Apps, die keine Drittanbieterbibliotheken verwenden ... bist du?)

In jedem Fall müssen Sie sich keine Sorgen machen, es sei denn, es gibt 100- und 100-Byte-Zuordnungen von 32 Byte während der gesamten Laufzeit Ihrer App (aber bitte melden Sie einen Fehler).

Wie Valkio sagte, können Sie den Stack-Trace der Zuweisung direkt von gdb (oder von Instruments) abrufen.

    
bbum 05.05.2011, 15:23
quelle
5

Sie können sehen, wo es zugewiesen wurde, wenn Sie dies tun:

  1. Gehe zu Produkt - & gt; Schema bearbeiten - & gt; Lauf (Debuggen) - & gt; Argumente.
  2. Fügen Sie dies Umgebungsvariablen hinzu: MallocStackLoggingNoCompact
  3. Setzen Sie es auf YES
  4. Lauf, und lass es abstürzen.
  5. Geben Sie in der Konsole (gdb) info malloc 0x4c8600 oder wie die Adresse auch lautet.
vakio 05.05.2011 15:18
quelle