web-dev-qa-db-ja.com

Windowsがプロセスを強制終了できないことがあるのはなぜですか?

現在、Visual Studioでアプリケーションを実行/デバッグしようとしていますが、app.vshost.exeの最後のインスタンスがまだ実行中であるため、アプリケーションを作成できません。次に、タスクマネージャーを使用してそれを強制終了しようとしていますが、アクティビティーのシグナルがなく、そこに残っています。

その特定のケース(多分Visual Studioのバグ)を超えて、Windowsがプロセスを強制終了できないことがある技術的な理由に非常に興味がありますか?

賢明なOS関連の開発者が説明してみてください。

(そして、Windowsに対してUnix/Linux/Macの戦いを開始しないでください。)

30

原因は通常、未完了の I/O 要求が進行中の応答しないドライバです。

Mark Russinovichのブログエントリ nkillable Processesarchiveを参照してください。

21
user27803

考えられる理由の1つは、デバッガーに接続されているタスクを強制終了できないことです。

タスクを停止する唯一の方法は、デバッガ自体からです。

18
harrymc

プロジェクトのPropertiesページを開き、Debugタブに移動して、[アンマネージコードのデバッグを有効にする]をオンにします。または、ホストプロセスを使用するためのオプションをオフにします。

3
Tadjou

1つの理由は、あなたがそれを殺す許可を持っていないことでしょう。例えば。プロセスが管理者として実行されていて、通常のユーザーである場合。

3
Brian Lyttle

私のOSレベルの開発経験は大学院でしかありませんでしたが、これが起こっているのではないかと思います(または同様のこと)。

デバッガーが処理しようとした最後のインスタンスの実行中にエラーが発生しましたが、他のいくつかの問題が原因で失敗しました(デバッグアサーションが発生した可能性がありますが、ダイアログをクリックして中止/再試行/無視する前に、別のブレークがトリガーされました、おそらくnullポインターが原因です)。その結果、デバッグを停止した後、デバッガーは最初のデバッグアサーションに対する応答をまだ待っていたため、プロセスを終了できませんでした。しかし、デバッグを停止すると(またはそれを実行しましたか?)、プロセスがゾンビに、またはそのツリーがゾンビに変わると、デバッガは終了しました。ゾンビプロセスを強制終了しようとすると、次のようなエラーが発生しましたが、タスクマネージャーから通知されませんでした。

C:\Windows\system32>taskkill /pid 9564 /f /t
ERROR: The process with PID 9564 (child process of PID 22520) could not be
terminated.
Reason: There is no running instance of the task.

親で同じことを試すことにした場合(私の場合、親はデバッガプロセスmsvsmon.exeでした)、同じように失敗します。

C:\Windows\system32>taskkill /pid 22520 /f /t
ERROR: The process with PID 9564 (child process of PID 22520) could not be
terminated.
Reason: There is no running instance of the task.
ERROR: The process with PID 22520 (child process of PID 13964) could not be
terminated.
Reason: There is no running instance of the task.

親はIDEによって開始されましたが、IDEはへその緒をカットしたため、2つのゾンビプロセスがあります。デバッグしているプロセスにデバッガをアタッチすることはできません。すでに(ゾンビ)デバッガーが接続されており、(ゾンビ)デバッガーにデバッガーを接続することはできません。

プロセスにアタッチできません。現在の状態では操作は無効です。

ゾンビはプロセステーブルに十分に残っているため、デバッガーを介して別のインスタンスを実行することはできませんが、IDE以外の場所で別のインスタンスを開始することはできます。

これは、VSがゾンビプロセスを作成するというより具体的な問題に対処します。しかし、ゾンビプロセスはしばしば死にません。まあ、多くの場合Windowsで、時にはLinuxで、ショットガンで撃つまではそうではありません。それともそれはシャットダウンでしたか?ただし、保留中のWindows更新が誤って適用されることに注意してください。

デバッガーとの接続を提案した以前の回答のいくつかに興奮しましたが、上記は私が得た結果です。だから私は私の答えを提出し、プロセステーブルを空にするために再起動しています。

2
hlongmore

最後のapp.vshost.exeがまだ実行されている場合は、デバッガーを使用してそのプロセスに接続します。

Debug-> AttachToProcessの下のメニューにあるはずです。次に、ハングしているプロセスを選択して接続します。

2

おそらく、ここで引用されているいくつかのツールを調べると、答えが得られるでしょうか?

https://stackoverflow.com/questions/49988/really-killing-a-process-in-windows

(ちょうど今、あるユーザーのWindows 7セッションで実行されているプロセスを、別のユーザーのセッション(または資格情報)から強制終了できるツールがpskillだけであることがわかりました。)

1
r_alex_hall