Mengapa terkadang Windows tidak dapat mematikan proses?

30

Saat ini saya sedang mencoba untuk Menjalankan / Debug aplikasi saya di Visual Studio, tetapi tidak dapat membuatnya karena contoh terakhir dari app.vshost.exemasih berjalan. Kemudian, dengan menggunakan Task Manager saya mencoba untuk membunuhnya, tetapi tetap saja tidak ada sinyal aktivitas.

Di luar kasus khusus itu (mungkin bug Visual Studio), saya sangat ingin tahu tentang alasan teknis mengapa terkadang Windows tidak dapat mematikan proses?

Bisakah, pengembang terkait OS yang tercerahkan, silakan coba jelaskan?

(Dan tolong jangan memulai pertempuran Unix / Linux / Mac melawan Windows.)

Néstor Sánchez A.
sumber
10
Jika saya hanya punya nikel untuk setiap kali saya ingin jawaban untuk pertanyaan ini ...
Steven Oxley
3
Saya menghargai jawabannya, tetapi saya ingin membaca pengembang Sistem Operasi yang menjelaskan mengapa sebuah OS pada zaman ini tidak dapat membunuh proses non-inti / kernel (atau kata sifat apa pun yang sesuai). Saya percaya karena 386 ada "cincin 0" (atau sesuatu yang sama) memberikan hak istimewa untuk beberapa kode di atas yang lain, saya pikir itu adalah cara (OS) proses memiliki otoritas atas yang lain. Mungkin saya benar-benar salah, tetapi pertanyaannya tetap tidak terjawab.
Néstor Sánchez A.

Jawaban:

21

Penyebabnya biasanya beberapa driver tidak responsif yang memiliki permintaan I / O yang belum selesai dalam proses.

Lihat entri blog Mark Russinovich's Unkillable Processes ( arsip )

Ian Boyd
sumber
Ini juga terjadi di Linux. Sementara arsitektur x86 memiliki 4 dering, hanya dua yang digunakan (dering 3 untuk userspace, dering 0 untuk kernel). Jadi semuanya adalah mode kernel atau ruang pengguna, dengan tidak ada di antaranya. Namun, solusi yang mungkin adalah driver "mode pengguna" yang bergantung pada mode kernel kecil yang dapat diandalkan yang hanya memanggil kode userspace. Saya percaya sebagian besar driver cetak dan USB di Windows adalah ini (driver grafis dulu di Windows 3.1), tetapi userspace membawa penalti kinerja.
LawrenceC
Tidak bisakah industri (Intel, AMD, ARM, dll.) Membuat "meta-ring" untuk akhirnya memberikan kepada pengguna (dengan risiko sendiri) kemampuan nyata untuk membunuh suatu proses dan menyingkirkan masalah ini sekali dan selamanya ????
Néstor Sánchez A.
16

Satu alasan yang memungkinkan: Anda tidak dapat membunuh tugas yang dilampirkan ke debugger.

Satu-satunya cara untuk menghentikan tugas adalah dari debugger itu sendiri.

harrymc
sumber
3
Bagaimana cara mengetahui apakah debugger dilampirkan dan proses apa yang dilampirkan? Karena saya tidak men-debug apa pun tetapi tugas tidak akan mati, tidak dengan pengelola tugas, tidak saat menghentikan layanan, tidak dengan taskkill /f, tidak dengan wmic ... call terminate... terus mengatakan "kesalahan: proses X dengan pid Y tidak dapat dihentikan Msgstr "Tidak ada instance berjalan dari tugas ini."
Luc
3

Salah satu alasannya adalah Anda tidak memiliki izin untuk membunuhnya. Misal jika proses berjalan sebagai administrator dan Anda adalah pengguna normal.

Brian Lyttle
sumber
3

Buka halaman Properties untuk proyek, buka tab Debug , dan centang "Aktifkan debugging kode yang tidak dikelola". Atau, hapus centang opsi untuk menggunakan proses host.

Tadjou
sumber
2

Jika app.vshost.exe terakhir masih berjalan, cukup sambungkan ke proses itu dengan debugger.

Seharusnya ditemukan di menu di bawah Debug-> AttachToProcess kemudian pilih proses gantung dan hubungkan ke sana.

Oliver Friedrich
sumber
2

Satu-satunya pengalaman pengembangan tingkat OS saya adalah di sekolah pascasarjana, tetapi saya menduga apa yang terjadi adalah ini (atau yang serupa):

Terjadi kesalahan saat menjalankan contoh terakhir yang mencoba ditangani oleh debugger, tetapi beberapa masalah lain menyebabkannya gagal (mungkin pernyataan debug ditemukan, tetapi sebelum Anda dapat mengklik dialog untuk Abort / Retry / Abaikan, jeda lain dipicu , mungkin karena pointer nol). Hasilnya, setelah Anda berhenti debug, adalah bahwa debugger masih menunggu respons Anda terhadap pernyataan debug pertama, sehingga tidak akan membiarkan proses berakhir. Tetapi kemudian debugger dihentikan ketika Anda berhenti debugging (atau melakukannya?), Mengubah proses menjadi zombie, atau pohonnya menjadi zombie. Ketika Anda mencoba untuk membunuh proses zombie, kesalahan yang mirip dengan ini terjadi, tetapi manajer tugas tidak memberi tahu Anda tentang hal itu:

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.

Jika Anda memutuskan untuk mencoba hal yang sama pada orang tua (dalam kasus saya orang tua adalah proses debugger, msvsmon.exe), gagal dengan cara yang sama:

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.

Induknya dimulai oleh IDE, tetapi IDE memotong tali pusar, jadi sekarang Anda memiliki dua proses zombie. Anda tidak dapat melampirkan debugger ke proses yang Anda debug, karena sudah ada debugger (zombie) terlampir, dan Anda tidak bisa melampirkan debugger ke debugger (zombie) karena, seperti yang akan dijelaskan oleh Visual Studio ketika Anda mencoba :

Tidak dapat melampirkan ke proses. Suatu operasi tidak sah dalam keadaan saat ini.

Zombi masih dalam tabel proses cukup baik untuk mencegah Anda menjalankan instance lain melalui debugger, tetapi Anda mungkin bisa memulai instance lain di luar IDE dengan baik.

Ini membahas masalah yang lebih spesifik dari memiliki VS membuat proses zombie. Tapi, proses zombie sering tidak mati. Yah, sering di Windows, kadang di Linux, tidak sampai Anda menembak mereka dengan senapan. Atau itu shutdown? Namun waspadalah terhadap aplikasi Windows yang tertunda tanpa disengaja.

Saya merasa senang dengan beberapa jawaban sebelumnya yang menyarankan melampirkan dengan debugger, tetapi di atas adalah hasil yang saya dapatkan. Jadi saya mengirimkan jawaban dan me-reboot untuk membersihkan tabel proses.

lebih lagi
sumber
Terima kasih, ini tentu jawaban terbaik yang cocok dengan masalah saya.
Pablo Ariel
-1

Kamu bisa!

Menggunakan ProcessHacker (klik kanan pada proses) -> Terminator.

Valmond
sumber
-1

Jika Anda menggunakan VS untuk proses debug, dan Anda membunuhnya dengan task manager. Kemudian VS tidak bisa mengatasinya dengan baik.

Jadi VS masih men-debug proses target tetapi Anda tidak bisa hanya menekan proses berhenti di VS. Hanya keluar dari VS Anda dan Anda akan melihat proses Anda keluar.

VictorV
sumber