Neden bazen Windows bir işlemi öldüremiyor?


30

Şu anda uygulamamı Visual Studio'da çalıştırmaya / hata ayıklamaya çalışıyorum, ancak son örneği app.vshost.exehala çalıştığı için oluşturamıyor. Daha sonra, Görev Yöneticisini kullanarak onu öldürmeye çalışıyorum, ama sadece aktivite sinyali olmadan orada kalıyor.

Bu özel durumun ötesinde (belki bir Visual Studio hatası), bazen Windows'un neden bir süreci öldüremediğinin teknik sebeplerini merak ediyorum.

Aydınlatılmış bir işletim sistemi ile ilgili geliştirici, lütfen açıklamaya çalışabilir misiniz?

(Lütfen Windows'a karşı bir Unix / Linux / Mac savaşı başlatmayın.)


10
Her zaman sadece bir nikel olsaydı, bu sorunun cevabını istedim ...
Steven Oxley

3
Cevapları takdir ediyorum, fakat bu dönemin işletim sisteminin neden çekirdek olmayan / çekirdek (veya ne tür bir sıfat uygunsa) işlemini öldüremediğini açıklayan bir İşletim Sistemleri geliştiricisi okumak istiyorum. 386'dan beri bazı kodlara diğerlerine özel ayrıcalıklar veren bir "ring 0" (veya benzeri bir şey) olduğuna inanıyordum, bir (OS) sürecinin diğerleri üzerinde yetki sahibi olduğunu düşündüm. Belki de tamamen yanılıyorum, ancak soru cevapsız kalıyor.
Néstor Sánchez A.,

Yanıtlar:


21

Bunun nedeni genellikle, bitmemiş G / Ç isteklerinin devam etmekte olan bazı yanıt vermeyen sürücüdür .

Mark Russinovich'in blog girişinde Unkillable Processes'e göz atın ( arşiv )


Bu Linux'ta da olur. X86 mimarisi 4 çalmaya sahipken, bunlardan sadece ikisi kullanılır (kullanıcı alanı için çalma 3, çekirdek için çalma 0). Yani her şey ya çekirdek modu ya da kullanıcı alanıdır, aralarında hiçbir şey yoktur. Ancak, olası bir geçici çözüm, yalnızca kullanıcı alanı kodunu çağıran küçük bir güvenilir çekirdek modu saplamasına bağlı olan "kullanıcı modu" sürücüleridir. Windows’taki çoğu yazıcı ve USB sürücüsünün bu olduğuna inanıyorum (Windows 3.1’de kullanılan grafik sürücüleri) ancak kullanıcı alanında performans cezası var.
LawrenceC

Endüstri (Intel, AMD, ARM, vb.) Nihayet kullanıcıya (bir risk altında) bir süreci öldürme ve bu problemden bir kez ve sonsuza dek kurtulma yeteneğini vermek için bir "meta-halka" oluşturamadı mı? ????
Néstor Sánchez A.,

16

Muhtemel bir sebep: Hata ayıklayıcısına bağlı bir görevi öldüremezsiniz.

Görevi durdurmanın tek yolu, hata ayıklayıcının kendisindendir.


3
Bir hata ayıklayıcının eklenip eklenmediğini ve hangi işlemin bağlı olduğunu nasıl anlayabilirim? Çünkü hiçbir şeyde hata ayıklama değilim ama görev ölmeyecek, görev yöneticisi ile değil, hizmeti durdururken değil taskkill /f, ile değil wmic ... call terminate... söyleyerek devam etmeyecek "hata": Y pideli X işlemi sonlandırılamadı Msgstr "Bu görevin çalışan örneği yok."
Luc

3

Bunun bir nedeni, onu öldürme izninizin olmamasıdır. Örneğin, işlem yönetici olarak çalışıyorsa ve normal bir kullanıcıysanız.


3

Projenin Özellikler sayfasını açın, Hata Ayıklama sekmesine gidin ve "Yönetilmeyen kod hata ayıklamasını etkinleştir" i işaretleyin. Veya, ana bilgisayar işlemini kullanma seçeneğinin işaretini kaldırın.


2

Son app.vshost.exe hala çalışıyorsa, sadece bu işleme hata ayıklayıcı ile bağlanın.

Menüde Debug-> AttachToProcess altındaki menüde bulunmalı, sonra asılı işlemi seçin ve bağlanın.


2

İşletim sistemi seviyesindeki tek gelişim deneyimim lisedeydi, fakat bunun ne olduğunu (veya benzeri bir şey) olduğundan şüpheliyim:

Hata ayıklayıcının işlemeyi denediği son örneği çalıştırırken bir hata oluştu, ancak başka bir sorun bunun başarısız olmasına neden oldu (belki bir hata ayıklama iddiasıyla karşılaşıldı, ancak İptal Et / Yeniden Dene / Yoksay iletişim kutusunu tıklayabilmeniz için önce başka bir mola tetiklendi , belki de boş bir gösterici nedeniyle). Sonuç, hata ayıklamayı bıraktıktan sonra, hata ayıklayıcının hala ilk hata ayıklama onayına verdiğiniz yanıtı bekliyor olmasıydı, bu nedenle işlemin sona ermesine izin vermedi. Ama sonra hata ayıklayıcı, hata ayıklamayı bıraktığınızda (veya yaptınız mı?), Süreci bir zombiye veya ağacını zombilere dönüştürdüğünüzde sona erdi. Zombi sürecini öldürmeye çalıştığında, buna benzer bir hata oldu, ancak görev yöneticisi sana bundan bahsetmedi:

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.

Ebeveyn üzerinde aynı şeyi denemeye karar verirseniz (benim durumumda ebeveyn hata ayıklayıcı işlemi, msvsmon.exe), aynı şekilde başarısız olur:

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.

Ebeveyn IDE tarafından başlatıldı, ancak IDE göbek kordonunu kesti, şimdi iki zombi işleminiz var. Hata ayıkladığınız sürece bir hata ayıklayıcı ekleyemezsiniz, çünkü zaten bağlı bir (zombi) hata ayıklayıcı vardır ve (zombi) hata ayıklayıcısına bir hata ayıklayıcı ekleyemezsiniz, çünkü Visual Studio size denediğinizde :

İşlem eklenemedi. Bir işlem mevcut durumda yasal değil.

Zombiler hala hata ayıklayıcıdan başka bir örnek çalıştırmanızı engellemek için işlem tablosunda yeterince iyi durumda, ancak muhtemelen IDE dışında başka bir örneği başlatabilirsiniz.

Bu, VS'nin bir zombi süreci yaratmasına ilişkin daha spesifik bir sorunu ele almaktadır. Ancak, zombi süreçleri genellikle ölmez. Genelde Windows’ta, bazen Linux’ta, av tüfeğiyle ateş edene kadar. Yoksa bu bir kapanma mıydı? Ancak bekleyen Windows güncellemelerinin yanlışlıkla uygulanmasına dikkat edin.

Hata ayıklayıcısına eklemeyi öneren önceki yanıtlardan bazılarında heyecanlandım, ancak yukarıdaki sonuç aldım. Bu yüzden cevabımı gönderiyorum ve işlem tablosunu temizlemek için yeniden başlatıyorum.


Teşekkürler, bu kesinlikle sorunumla eşleşen en iyi cevap.
Pablo Ariel



-1

İşlemi hata ayıklamak için VS kullanıyorsanız ve görev yöneticisi ile öldürürseniz, VS bu işlemle iyi baş edemez.

Öyleyse VS hala hedef süreçte hata ayıklamaya devam ediyor, ancak VS.Just'deki stop işlemine sadece basamıyorsunuz. VS'den çıkın ve işleminizin çıkışını göreceksiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.