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


30

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

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

啓発されたOS関連の開発者は、説明してみてください。

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


10
私は...私はこの質問への答えを望んでいたすべての時間のためのニッケルを持っていた場合
スティーブン・オクスリー

3
私は答えに感謝しますが、この時代のOSが非コア/カーネル(または適切な形容詞)プロセスを殺すことができない理由を説明するオペレーティングシステム開発者を読みたいです。386以来、他のコードよりも特定のコードに特別な特権を与える「リング0」(またはそれに似たもの)があると信じていました。私は完全に間違っているかもしれませんが、質問は未回答のままです。
ネスターサンチェスA.

回答:


21

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

Mark Russinovichのブログエントリ「Unkillable Processes archive」を参照してください


これはLinuxでも発生します。x86アーキテクチャには4つのリングがありますが、そのうちの2つだけが使用されます(ユーザー空間にはリング3、カーネルにはリング0)。そのため、すべてがカーネルモードまたはユーザースペースのいずれかであり、間に何もありません。ただし、考えられる回避策は、ユーザースペースコードを呼び出すだけの小さな信頼できるカーネルモードスタブに依存する「ユーザーモード」ドライバーです。Windowsのほとんどの印刷およびUSBドライバーはこれ(Windows 3.1にあったグラフィックドライバー)であると思いますが、ユーザー空間にはパフォーマンスの低下が伴います。
ローレンス

業界(Intel、AMD、ARMなど)が「メタリング」を作成して、最終的に(自分のリスクで)ユーザーにプロセスを強制終了し、この問題を永久に取り除く真の機能を与えることはできませんでした????
ネスターサンチェスA.

16

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

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


3
デバッガがアタッチされているかどうか、どのプロセスがアタッチされているかを知るにはどうすればよいですか?私は何もデバッグしていないので、タスクは死なない、タスクマネージャではなく、サービスを停止するときでも、taskkill /fでなく、wmic ... call terminate... ではなく、「エラー:pid YのプロセスXを終了できませんでした」 。このタスクの実行中のインスタンスはありません。」
リュック

3

理由の1つは、それを強制終了する権限がないことです。たとえば、プロセスが管理者として実行されており、あなたが通常のユーザーである場合。


3

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


2

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

メニューの[デバッグ]-> [AttachToProcess]にあり、ハングしているプロセスを選択して接続します。


2

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

デバッガーが処理しようとした最後のインスタンスの実行中にエラーが発生しましたが、他の問題が原因で失敗しました(デバッグアサーションが発生した可能性がありますが、Abort / Retry / Ignoreのダイアログをクリックする前に、別のブレークがトリガーされました) 、おそらく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つのゾンビプロセスができました。デバッグしているプロセスにデバッガーをアタッチすることはできません。既に(ゾンビ)デバッガーが接続されているためです。また、Visual Studioは:

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

ゾンビはまだデバッガーを介して別のインスタンスを実行できないように十分にプロセステーブル内にありますが、おそらくIDEの外部で別のインスタンスを正常に起動できます。

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

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


おかげで、これは確かに私の問題に合った最良の答えです。
パブロアリエル

1

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

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

(たった今、pskillは、あるユーザーのWindows 7セッションで実行中のプロセスを別のユーザーのセッション(または資格情報、私が推測すると)を殺すことができるいくつかのツールであることがわかりました。



-1

VSを使用してプロセスをデバッグしている場合、タスクマネージャーでそれを強制終了します。その後、VSはそれをうまく処理できません。

VSはまだターゲットプロセスをデバッグしていますが、VSで停止プロセスを押すことはできません。VSを終了すると、プロセスが終了します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.