2013-12-15 13 views
6

私は、メモリリークのために外を見るためにプロファイラを利用して、この問題に出くわしています:iOS:Xcode計測器からのリークを特定する方法は?

enter image description here

私はツリーを呼び出すために切り替えます。

だから私はそれについての詳細を知るために、それをクリックすることができる:

enter image description here

しかし、それは本当に私に任意の手掛かりを与えるものではありません。漏れの原因を知る方法は?

enter image description here

UPDATE:

  • 示すシステムライブラリとコールツリーは、上記更新されます。
  • オブジェクトに関する情報が漏洩した:

enter image description here

  • をあなたはこのリークを再現するアプリで何をすべきかのいくつかの説明:

我々のアプリは、私たちのREST-と同期されますアプリの開始(フォアグラウンド)時のAPI。これはいつも私のiOS 7/iPhone 4Sで動作します。しかし、別の開発者はiOS7/iPhone 5を持っていて、それが同期しないという問題にめったに動かない。観察し、どこでもNSLogsを置くの10日後、私たちは、この最後の夜が見つかりました:(ホームボタンを押すと、フォアグラウンドに戻って来て)同期する

Dec 15 03:18:58 appname[4801] <Warning>: A gateway to the host server is working via WWAN. 
Dec 15 03:18:58 appname[4801] <Warning>: Syncing... 
Dec 15 03:18:58 appname[4801] <Warning>: Eventname to be fired: f11-reachability 
Dec 15 03:18:58 appname[4801] <Warning>: Sync event IOS_REACHABILITY reached. 
Dec 15 03:18:58 appname[4801] <Warning>: Sync: IOS_SYNC_WITH_SERVER is true 
Dec 15 03:18:58 appname[4801] <Warning>: Animating indicator... 
Dec 15 03:18:58 appname[4801] <Warning>: Getting last timestamp: 1387003344.407783 then calling syncWithServerWithDate 
Dec 15 03:19:27 com.apple.launchd[1] <Notice>: (UIKitApplication:com.apple.mobilecal[0x45fb]) Exited: Killed: 9 
Dec 15 03:19:27 com.apple.launchd[1] <Notice>: (com.apple.afcd) Idle-exit job was jettisoned. Will bypass throttle interval for next on-demand launch. 
Dec 15 03:19:27 com.apple.launchd[1] <Error>: (com.apple.afcd) assertion failed: 11B554a: launchd + 35697 [3C91C465-EFA6-32C7-A677-DD0B5FDEE0DC]: 0x9 
Dec 15 03:19:27 com.apple.launchd[1] <Notice>: (com.apple.absd) Idle-exit job was jettisoned. Will bypass throttle interval for next on-demand launch. 

3回目の試みは、低メモリを示していた、私たちにこれを与えた:

Dec 15 03:25:18 C1 appname[4801] <Warning>: Getting last timestamp: 1387003344.407783 then calling syncWithServerWithDate 
Dec 15 03:25:29 C1 profiled[6244] <Notice>: (Note) profiled: Service stopping. 
Dec 15 03:25:40 C1 crash_mover[6248] <Notice>: (Warn) <crash_mover.m mv_recursive:98> Moving './LowMemory-2013-12-14-160222.plist' -> '/var/mobile/Library/Logs/CrashReporter/LowMemory-2013-12-14-160222.plist' 

私はプロファイラに行って、何かを見つけたかどうかを確認しました。

これを再現するために、私はアプリを起動し、ホーム画面に進み、次にSimulate a Low Memoryを押して、フォアグラウンドに戻るようにアプリをクリックしました。これは私が赤いスパイクを得る場所です。

  • 実行しているXcodeのバージョン。

Xcode 5.02。 iPhone 4S(OK)、iPhone 5(希少ケース)のiOS 7.04

これが役立つことを願っています。ありがとう

+0

"Call Tree"の見出しの下の左の小さなボックス。私は通常、すべてをクリックすると読みやすい結果が得られることがわかります。 –

+0

メモリ警告を手動でシミュレートしたときに、同僚が経験した同期失敗を明示しましたか? – Rob

答えて

2

リークの赤いスパイクのような脅威が現れるので、漏れた合計メモリは1.06kbです。これはあなたの問題の原因となることはほとんどありません。

あなたのアプリの面では、他のアプリを投げ捨てること自体は問題ではありません。私はあまり気にしませんでした(しかし、良い市民になるためには、 )。より即座の機能的な問題は、あなたのアプリが同期に失敗した理由と、これが本当にアプリ内のメモリ警告の結果であるかどうかです(より正確には、メモリ警告に応答してアプリを十分に解放することができません。後続のメモリ割り当てで失敗する)。

私の考えでは、最初の質問は、実際にあなたのアプリでメモリの警告を受け取っているかどうかです。

 
Dec 15 11:12:26 Robs-iPad myapp[2224] : Received memory warning. 

しかし、「私はあなたのコンソール・ダンプで上記が表示されていないので、それは私はあなたかどうかを思ってしまう:アプリは本当にメモリの警告があった場合、一般的に、私は、コンソールに以下のようなものを参照してくださいね実際にメモリの警告を受け取っています。

私はあなたのアプリケーションのデリゲートで明示的にログを挿入する提案するかもしれません:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 
{ 
    NSLog(@"%s", __FUNCTION__); 

    // free whatever caches or other temporary resources you can here 
} 

またはビューコントローラに特別な処理を入れ:

私のコンソールに次のように見につながる
- (void)didReceiveMemoryWarning 
{ 
    NSLog(@"%s", __FUNCTION__); 

    [super didReceiveMemoryWarning]; 

    // do whatever you want to free resources here 

    [[[UIAlertView alloc] initWithTitle:nil 
           message:@"didReceiveMemoryWarning" 
           delegate:nil 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil] show]; 
} 

 
Dec 15 11:12:26 Robs-iPad myapp[2224] : -[AppDelegate applicationDidReceiveMemoryWarning:] 
Dec 15 11:12:26 Robs-iPad myapp[2224] : -[ViewController didReceiveMemoryWarning] 

しかし、重要な目標は、あなたが本当にarかどうかを確認することですメモリ警告を受け取り、それが本当にあなたのアプリの同期失敗と相関しているかどうかを確認します。

しかし、問題は実際にはメモリ警告の結果であると想定してみましょう。最初に、最初にメモリ警告を緩和するために何をしていますか(例えば、@autoreleasepoolを使用して最高水準点を緩和し、絶対に必要でない場合に大きなリソースを同時に保持しないでください)。imageWithContentsOfFileimageNamedではなく)?次に、メモリの警告(たとえば、キャッシュをパージしていますか?)に応じて、あなたは何をしていますか?

メモリの警告が本当に問題の原因であることを確認したら(最初に行う)、同期処理中に割り当てグラフを調べると面白いかもしれません。ライブバイト、およびライブバイトの最終数)。あなたの質問で割り当てグラフを見ると、それほど悪くはない(つまり、揺れはありません)が、「ライブバイト」の数を共有していないので、言うことは難しいです。

メモリの警告をシミュレートすると、1kbのこのリークが心配されません。それはあなたが心配する必要があるどんな深刻な症状よりも迷惑です。漏れを見守ってください。しかし、(a)大きな漏れに注意してください。 (b)あなたのコードのものであり、フレームワークのものではありません。


私のオリジナルの答えは、以下、単に「私のコードに対応していないようだ楽器で示されるこのリークは何ですか」だった元の質問に応じていました。私は参考のためにここでそれをしておこう:


これは漏れがあなたのコード内ではなく、(あなたが隠されてきた)のシステムフレームワークではないことを示唆しているかもしれません。

あなたが共有したい場合があります:

  • 示すシステムライブラリとコールツリー。

  • 漏れたオブジェクトに関する情報(「コールツリー」だけでなく「リーク」リストも)。

  • このリークを再現するためにアプリで何をするのかの説明。

  • この問題が発生するのは、この問題が現れるバージョンと、どのバージョンでないかです(フレームワーク自体はリークがなく、iOSのターゲットによって異なります)。と

  • 実行しているXcodeのバージョン。

この問題を無視して、(a)漏れの大きさを無視してください。 (b)問題があなたのコードの中にあることの表示の欠如。 (c)iOSフレームワークがあなたのコントロール外に漏れているという事実。しかし、もしあなたが懸念しているなら、上記の情報のいくつかを共有すれば、我々はさらなる観察を提供することができるかもしれません。

+0

Robに感謝します。私は質問を更新し、あなたが求めたすべてを提供しました。このバグの10日間の狩りの後、私たちは少し悲しみの状態にあります。ここで何かを教えてくれることを願っています。 :) – Houman

+0

@Hooman私は自分の答えを広げましたが、要するに、問題がメモリ警告に関連していることは明らかではありません(1kbリークとはほとんど関係ありません)。あなたのアプリは明らかに他のアプリを投棄させていますが、メモリ警告の証拠は表示されません。メモリ警告の結果であっても、リソースを解放した場合、割り当てが少し落ちるはずです(そうしないと、メモリ警告が発生した状況を解決していない場合、アプリケーションがクラッシュする可能性が最も高くなります) 。アプリがクラッシュしているのですか、同期していませんか? – Rob

関連する問題