Por que às vezes o Windows não pode matar um processo?

30

No momento, estou tentando executar / depurar meu aplicativo no Visual Studio, mas ele não pode criá-lo porque a última instância do app.vshost.exeainda está em execução. Então, usando o Gerenciador de Tarefas, estou tentando matá-lo, mas ele permanece lá sem nenhum sinal de atividade.

Além desse caso específico (talvez um bug do Visual Studio), estou muito curioso sobre os motivos técnicos pelos quais, às vezes, o Windows não pode matar um processo?

Pode, um desenvolvedor esclarecido relacionado ao SO, tente explicar?

(E por favor, não inicie uma batalha Unix / Linux / Mac contra o Windows.)

Néstor Sánchez A.
fonte
10
Se eu tivesse um níquel para cada vez que eu queria a resposta a esta pergunta ...
Steven Oxley
3
Agradeço as respostas, mas gostaria de ler um desenvolvedor de sistemas operacionais explicando por que um sistema operacional desta época não pode matar um processo que não é do núcleo / núcleo (ou qualquer outro adjetivo que seja apropriado). Eu acreditava que, desde o 386, havia um "anel 0" (ou algo parecido) que dava privilégios especiais a um código em detrimento de outro, eu achava que era assim que um processo (SO) tem autoridade sobre outros. Talvez eu esteja completamente errado, mas a pergunta permanece sem resposta.
Néstor Sánchez A.

Respostas:

21

A causa geralmente é um driver que não responde e que solicitações de E / S inacabadas estão em andamento.

Veja a entrada no blog de Mark Russinovich Processos Inomináveis ( arquivo )

Ian Boyd
fonte
Isso acontece no Linux também. Enquanto a arquitetura x86 possui 4 anéis, apenas dois deles são usados ​​(anel 3 para espaço no usuário, anel 0 para kernel). Portanto, tudo está no modo kernel ou no espaço do usuário, sem nada no meio. Porém, uma possível solução alternativa são os drivers "modo usuário", que dependem de um pequeno stub confiável no modo kernel que apenas chama o código do espaço do usuário. Acredito que a maioria dos drivers USB e de impressão no Windows seja essa (os drivers gráficos costumavam estar no Windows 3.1), mas o espaço do usuário acarreta uma penalidade de desempenho.
LawrenceC
A indústria (Intel, AMD, ARM etc.) não poderia criar um "meta-anel" para finalmente dar ao usuário (por seu próprio risco) a capacidade real de matar um processo e se livrar desse problema de uma vez por todas ????
Néstor Sánchez A.
16

Um motivo possível: você não pode matar uma tarefa anexada a um depurador.

A única maneira de interromper a tarefa é pelo próprio depurador.

harrymc
fonte
3
Como faço para descobrir se um depurador está anexado e qual processo está anexado? Porque eu não estou depurando nada, mas a tarefa não morre, nem com o gerenciador de tarefas, nem ao interromper o serviço, nem com taskkill /f, nem com wmic ... call terminate... continua dizendo "erro: o processo X com o pid Y não pôde ser encerrado Não há instância em execução desta tarefa. "
Luc
3

Uma razão seria que você não tem permissão para matá-lo. Por exemplo, se o processo estiver sendo executado como administrador e você for um usuário normal.

Brian Lyttle
fonte
3

Abra a página Propriedades do projeto, vá para a guia Debug e marque "Ativar depuração de código não gerenciado". Ou desmarque a opção para usar o processo host.

Tadjou
fonte
2

Se o último app.vshost.exe ainda estiver em execução, conecte-se a esse processo com o depurador.

Deve ser encontrado no menu em Debug-> AttachToProcess, em seguida, escolha o processo suspenso e conecte-se a ele.

Oliver Friedrich
fonte
2

Minha única experiência de desenvolvimento no nível do sistema operacional foi na pós-graduação, mas suspeito que o que está acontecendo é isso (ou algo semelhante):

Ocorreu um erro ao executar a última instância que o depurador tentou manipular, mas algum outro problema causou a falha (talvez uma afirmação de depuração tenha sido encontrada, mas antes que você pudesse clicar na caixa de diálogo para Abortar / Repetir / Ignorar, outra interrupção foi acionada , talvez devido a um ponteiro nulo). O resultado, depois que você parou de depurar, foi que o depurador ainda estava aguardando sua resposta à primeira asserção de depuração, para que não deixasse o processo terminar. Mas o depurador foi encerrado quando você parou de depurar (ou fez isso?), Transformando o processo em um zumbi ou sua árvore em zumbis. Quando você tentou interromper o processo de zumbi, ocorreu um erro semelhante ao ocorrido, mas o gerenciador de tarefas não falou sobre isso:

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.

Se você decidir tentar a mesma coisa no pai (no meu caso, o pai foi o processo do depurador, msvsmon.exe), ele falhará da mesma maneira:

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.

O pai foi iniciado pelo IDE, mas o IDE cortou o cordão umbilical, então agora você tem dois processos zumbis. Você não pode anexar um depurador ao processo que estava depurando, porque já existe um depurador (zumbi) conectado e não é possível anexar um depurador ao depurador (zumbi) porque, como o Visual Studio informará quando você tentar :

Não foi possível anexar ao processo. Uma operação não é legal no estado atual.

Os zumbis ainda estão na tabela de processos suficientemente bem para impedir que você execute outra instância através do depurador, mas você provavelmente poderia iniciar outra instância fora do IDE.

Isso aborda a questão mais específica de fazer com que o VS crie um processo de zumbi. Mas, processos de zumbis geralmente não morrem. Bem, geralmente no Windows, às vezes no Linux, não até você atirar neles com uma espingarda. Ou foi um desligamento? Mas cuidado com o aplicativo acidental de atualizações pendentes do Windows.

Fiquei empolgado com algumas das respostas anteriores que sugeriam anexar ao depurador, mas o resultado acima foi o que obtive. Então, estou enviando minha resposta e reiniciando para limpar a tabela de processos.

hlongmore
fonte
Obrigado, esta é certamente a melhor resposta que corresponde ao meu problema.
Pablo Ariel #
-1

Você pode!

Usando ProcessHacker (clique com o botão direito do mouse no processo) -> Terminator.

Valmond
fonte
-1

Se você estiver usando o VS para depurar o processo e o matar com o gerenciador de tarefas, o VS não poderá lidar bem com isso.

Portanto, o VS ainda está depurando o processo de destino, mas você não pode simplesmente pressionar o processo de parada no VS. Basta encerrar o VS e você verá o processo sair.

VictorV
fonte