web-dev-qa-db-ja.com

Leaksインストゥルメントに表示されないときにメモリリークをデバッグする方法

私はiOSアプリをSwiftでリークしています。特定の状況では、一部のオブジェクトを解放する必要がありますが、そうではありません。単純にdeinit debugこのようなメッセージ:

deinit {
    println("DEINIT: KeysProvider released")
}

そのため、オブジェクトを解放するようなイベントの後に、コンソールにdeinitメッセージが表示されます。ただし、解放する必要があるオブジェクトの一部については、メッセージが欠落しています。それでも、Leaks Developer Toolにはリークは表示されません。そのような状況をどのように解決しますか?

53
Rasto

Xcode 8では、「Debug Memory Graph」ボタンをクリックできます debugmemorygraphbutton デバッグツールバー(画面の下部に表示):

debug memory graph

左パネルで、割り当てを解除する必要があると思われるオブジェクトを特定するだけで、オブジェクトグラフ(上記のメインキャンバスに表示)が表示されます。これは、問題のオブジェクトで強い参照が確立された場所をすばやく識別するのに非常に役立ちます。ここから、これらの強参照が解決されなかった理由を診断して調査を開始できます(たとえば、問題のオブジェクトが、割り当て解除されるはずの別のものからの強参照を持っている場合、そのオブジェクトのグラフも見てください。問題(強力な参照サイクル、繰り返しタイマーなど)。

右側のパネルに、呼び出しツリーが表示されていることに注意してください。スキーム設定で「malloc stack」ロギングオプションをオンにすることでそれを実現しました。

malloc stack

とにかく、それを行った後、上の最初の画面スナップショットの右側のパネルのスタックトレースに表示される関連メソッド呼び出しの横の矢印をクリックすると、その強参照が最初に確立された場所を確認できます。

code

上記のメモリ診断技術(およびそれ以上)は、WWDC 2016の後半で実証されています Xcodeを使用したビジュアルデバッグ


私の元の答えでは、従来のインスツルメンツの手法(Xcodeの古いバージョンを使用している場合に特に便利です)を以下に説明します。


Instrumentsの「Allocations」ツールと「Record Reference Counts」機能を使用することをお勧めします。

record reference counts

次に、Instrumentsでアプリを実行してから、リークしていることがわかっているクラスを検索し、矢印をクリックしてドリルインします。

enter image description here

その後、右側の「拡張詳細」パネルを使用して、詳細にドリルダウンし、スタックトレースを確認できます。

extended details

その「拡張詳細」パネルで、グレーのシステムコールではなく黒のコードに注目します。とにかく、「拡張詳細」パネルから、Instrumentsでソースコードにドリルできます。

your code

Instrumentsを使用してメモリの問題を追跡するための詳細とデモについては、以下を参照してください。

112
Rob

機器を使用して、メモリを保持しているがリークしていないことによるリークとメモリ損失を確認します。後者は未使用のメモリであり、まだポイントされています。 InstrumentsのAllocationsインストゥルメントでMark Generation(Heapshot)を使用します。

Heapshotを使用してメモリの空き容量を見つける方法については、 bbum blog を参照してください。

基本的に、このメソッドは、Instruments allocate toolを実行し、ヒープショットを取得し、コードの反復を実行し、3〜4回繰り返す別のヒープショットを取得します。これは、反復中に割り当てられ、解放されていないメモリを示します。

結果を把握するには、個々の割り当てを確認するために開示します。

オブジェクトの保持、リリース、および自動リリースがどこで発生するかを確認する必要がある場合は、以下を使用します。

インストゥルメントで実行し、[割り当て]で[参照カウントの記録]をオンに設定します(Xcode 5以前の場合、オプションを設定するには記録を停止する必要があります)。アプリを実行し、記録を停止し、ドリルダウンすると、すべての保持、リリース、自動リリースが発生した場所を確認できます。

2
zaph