2012-11-03 19 views
24

iOSアプリケーションのXcodeで数日間働いた後、100を超えるゾンビプロセスがぶつかっていることに気付きました。単体テストを実行するたびに1つずつ表示され、シミュレータで全アプリを実行したときに1つずつ表示されるようです。ここではサンプル(洗浄と切り捨て)です:iOSテスト/シミュレータを実行した後にゾンビプロセスを残すXcode

> ps -efj | grep $PRODUCT_NAME 
    502 2794 236 0 Wed12AM ??   0:00.00 (MyProduct) me   2794  0 1 Z  ?? 
    502 2843 236 0 Wed01AM ??   0:00.00 (MyProduct) me   2843  0 1 Z  ?? 
    502 2886 236 0 Wed01AM ??   0:00.00 (MyProduct) me   2886  0 1 Z  ?? 
... 
    502 13711 236 0 Thu11PM ??   0:00.00 (MyProduct) me   13711  0 1 Z  ?? 
    502 13770 236 0 Thu11PM ??   0:00.00 (MyProduct) me   13770  0 1 Z  ?? 
    502 14219 236 0 10:35AM ??   0:00.00 (MyProduct) me   14219  0 1 Z  ?? 
    502 14280 236 0 10:38AM ??   0:00.00 (MyProduct) me   14280  0 1 Z  ?? 

最後の列に2番目のZは、彼らはゾンビプロセスあることを示します。 3番目の列の236は親PIDであり、この場合私のユーザーのlaunchdに属します。

一部のプロセスは複数日間経過していることに注意してください。この期間中にXcodeを数回終了してから再開しました。

なぜこのようなことが起こるのか、またはこれがアラームの原因になるかどうかは知っていますか?

+0

私は437ゾンビとカウントしています。遅かれ早かれ起こる唯一の問題は、新しいプロセスを開始することができないということです。ゾンビを念頭に置いてください。なぜ私がもうコンパイルできなかったのかを理解してくれました。また、http://stackoverflow.com/a/7860828/457406 –

+0

@eskerを参照してください。再起動とは別に解決策を見つけましたか? –

+0

いいえ、私が理解する限り、それはそれがうまくいく方法です。 'launchd'に属するゾンビプロセスについて、以下の議論を参照してください。潜在的な唯一の問題は、しばらくすると 'pid'を使い果たす可能性があるようです。 –

答えて

3

特に多くの部屋を占めるわけではありません。

これは、不適切にサブプロセスを強制終了するXcode機構のアーチファクトのようです。

私は同じ問題を抱えていますが、私の場合、ゾンビは私の名前の下でlaunchdの呼び出しである代わりにppid 271に属しています。

私はそのプロセスを殺したり、掃除したらどうなるか分かりました。いずれの場合においても

ゾンビおそらく明確な意志 をログアウト。そして、確かにリブートが行われますが、それは私の本では避けなければなりません。


かなり悪いを行ってきましたああ、。 打ち上げたを打ち切ってはいけません。あなたのセッションを無意識に殺しますが、ログイン画面を表示するようなことはありません。

私はXcodeを停止するために、私はゾンビを残したままにしておく必要があります。ここには愚かなことがいくつかあるようです。あなたのプロセスは子供を待たずに、ゾンビになってしまいます。親が死ぬと、その行の次のものが得られます。この場合はlaunchdです。 Launchdはそれを待つべきですが、混乱するかもしれません。

+8

'特に多くの部屋を占めるわけではありません。 ' もっと重要なことを除いて真です:あなたが作成できるプロセスの数を食べます。 'fork'が失敗してexecの' kill'イベントができなくなる – 2mia

+0

@ 2miaは完全に正しいですが、数日後に私のdevシステムを再起動せずにこのフォークエラーが発生します。 –

+0

@ 2miaが正しいです。リブートしないで数日後に、フォークエラーが頻繁に発生します。再起動することは非常に面倒です。許可されたプロセスの量を増やすことを含まないその他の修正/回避策? –

15

私のMBPがSTARNET Initプロシージャを実行するように要求されたように聞こえるような、特に重いXcodeセッションの後、私はこのゾンビプロセスナンセンスを調べることに決めました。結局のところ、フォークは役に立たないUnixボックスです。私はかもしれない良いニュースがあります。うまくいけば、我々は見るでしょう。 10.8.2でXcode 4.6を実行しています。

ゾンビ問題は、GDBまたはLLDBの使用状況に関係なく発生するようです。シミュレータ内で実行されているアプリケーションは、デバッグプロセス(GDBまたはLLDBの場合は "debugserver")によって所有されます。 「停止」を押すと、シミュレータで実行中のアプリプロセスがゾンビになります。これは、不完全なシャットダウンシーケンスのように聞こえます。

「停止」を押すよりもむしろ、私はアプリケーションを一時停止し、デバッグコンソール(私の場合はLLDB)で、「プロセスデタッチ」を使用して実行中のアプリケーションから切り離しました。速いpsはdebugserverがもはや走っていないことを確認します...これまでのところ良いです!今、アプリケーションはシミュレータ自体で実行されていますが、デバッグされていません。実際、停止ボタンを押すことは今やノーオペレーションです。

シミュレータで、ホームボタンを押してスプリングボードに戻り、ホームボタンをダブルクリックして手動でアプリケーションを終了します。コマンドラインに行き、ゾンビを探してください...ゾンビはありません!わーい。

だから次のステップは、このようなシャットダウン手順をPythonスクリプトなどで実行する合理的な方法があるかどうかを確認することです。 'GDB上であれば助けにならないコース。私が単一のデバッグコンソールコマンドでクリーンなシャットダウンを行うことができれば、壊れた停止ボタンに当たらないようにするだけです。たぶん、それを完全に無効にするには、リソースハックがあります... :)

EDIT#1:興味深い情報のカップル...

1)Xcodeで停止ボタンを押すだけであからさまなデバッグとアプリのプロセスを殺します - - 完全なシャットダウンは一切行いません。アプリケーションデリートのprintfデバッグapplicationWillTerminateとapplicationDidEnterBackgroundは、実行中のアプリケーションが偏見を持って殺されていることを示します。コンソールにはNSLogは表示されません。 [のUIApplication terminateWithSuccess]を呼び出して、デバッグコンソールで

2)は、アプリが「適切」に終了するようになりますが、それでもあなたはブレークポイントが設定されている場合は、興味深いことに、アプリは終了しません...ゾンビを残し:

(lldb) expression 
Enter expressions, then terminate with an empty line to evaluate: 
[(UIApplication *)[UIApplication sharedApplication] terminateWithSuccess] 

error: Execution was interrupted, reason: breakpoint 2.1. 
The process has been returned to the state before execution. 
(lldb) breakpoint disable 2.1 
1 breakpoints disabled. 
(lldb) expression 
Enter expressions, then terminate with an empty line to evaluate: 
[(UIApplication *)[UIApplication sharedApplication] terminateWithSuccess] 

2013-03-25 01:28:00.186 iPhone Testbed[9481:c07] -[AppDelegate applicationWillTerminate:] 
(lldb) 

アプリは何らかのシャットダウンプロセスを経て、コンソールでショーを終了しますが、まだゾンビがあるので、まだ完全シャットダウンではありません。

私は、この全部が、iOSランタイム内のバックグラウンドに向かうアプリと関係していると考えています。 iOSランタイムは適切なシャットダウンやクリーンアップを実行できません。実際、バーンボードはアプリがバックグラウンドで実行されていると考えています。プロセスはもはや存在しません。私たちのiOSとOS Xのランタイムは同じなので、ゾンビを所有しています。

私はこのすべての解決策が、iOSレベルでのクリーンなシャットダウン手順を決定しており、少なくともデバッグコンソールでそのことを実行できると考えています。私は、デバッグデタッチ時にアプリケーションのシャットダウンをきちんとするために、実行時に(plistとは対照的に)実行時に必要なビットを設定できるかどうかを見てみましょう...

+0

非常に興味深い答え。これまでのところ、私はこれまでこの分野で最も完全なものでした。あらゆる開発を楽しみにしています! – Frizlab

+0

ありがとうございます。 launchdが自動的にゾンビを手に入れることは意味がありますか? (あるいは、そうするために少なくともlaunchctlオプションがある?) –

関連する問題