때때로 Windows가 프로세스를 종료 할 수없는 이유는 무엇입니까? 관리자를 사용하여

지금은 Visual Studio에서 내 응용 프로그램을 실행 / 디버그하려고하지만 마지막 인스턴스 app.vshost.exe가 계속 실행 중이므로 만들 수 없습니다 . 그런 다음 작업 관리자를 사용하여 작업을 중단하려고하지만 활동 신호가없는 상태로 유지됩니다.

그 특별한 경우 (Visual Studio 버그 일 수도 있음) 외에도 Windows가 프로세스를 죽일 수없는 기술적 이유가 궁금합니다.

깨달은 OS 관련 개발자가 설명해 주시겠습니까?

(그리고 Windows와의 Unix / Linux / Mac 전투는 시작하지 마십시오.)



답변

원인은 일반적으로 I / O 가 완료되지 않은 일부 응답하지 않는 드라이버입니다. 요청이 진행중인 .

Mark Russinovich의 블로그 항목 Unkillable Processes ( archive )를 참조하십시오


답변

한 가지 가능한 이유 : 디버거에 연결된 작업을 종료 할 수 없습니다.

작업을 중지하는 유일한 방법은 디버거 자체입니다.


답변

한 가지 이유는 당신이 그것을 죽일 권한이 없기 때문입니다. 예를 들어 프로세스가 관리자로 실행 중이고 일반 사용자 인 경우


답변

프로젝트 의 속성 페이지를 열고 디버그 탭으로 이동하여 “관리되지 않는 코드 디버깅 사용”을 선택하십시오. 또는 호스트 프로세스 사용 옵션을 선택 취소하십시오.


답변

마지막 app.vshost.exe가 여전히 실행 중이면 디버거를 사용하여 해당 프로세스에 연결하십시오.

Debug-> AttachToProcess 아래의 메뉴에서 정지 프로세스를 선택하고 연결하십시오.


답변

저의 OS 수준의 개발 경험은 대학원에 있었지만, 무슨 일이 일어나고 있는지 의심 스럽습니다.

디버거가 처리하려고 시도한 마지막 인스턴스를 실행하는 동안 오류가 발생했지만 다른 문제로 인해 오류가 발생했습니다 (디버거 어설 션이 발생했을 수 있지만 중단 / 다시 시도 / 무시) 대화 상자를 클릭하기 전에 다른 중단이 발생했습니다. , 아마도 널 포인터로 인해). 결과적으로 디버깅을 중단 한 후 디버거가 여전히 첫 번째 디버그 어설 션에 대한 응답을 기다리고 있었으므로 프로세스가 종료되지 않았습니다. 그러나 디버깅을 중단하거나 프로세스를 좀비로 바꾸거나 트리를 좀비로 바꾸면 디버거가 종료되었습니다. 좀비 프로세스를 종료하려고 할 때 이와 유사한 오류가 발생했지만 작업 관리자가 이에 대해 알려주지 않았습니다.

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는 탯줄을 잘라서 이제 두 가지 좀비 프로세스가 있습니다. 이미 (좀비) 디버거가 연결되어 있기 때문에 디버깅중인 프로세스에 디버거를 연결할 수 없으며 Visual Studio에서 시도 할 때 알려주므로 디버거를 (좀비) 디버거에 연결할 수 없습니다 :

프로세스에 첨부 할 수 없습니다. 현재 상태에서 작업이 합법적이지 않습니다.

좀비는 여전히 프로세스 테이블에있어 디버거를 통해 다른 인스턴스를 실행할 수는 없지만 IDE 외부에서 다른 인스턴스를 시작할 수 있습니다.

이것은 VS가 좀비 프로세스를 만드는 데 대한 더 구체적인 문제를 해결합니다. 그러나 좀비 프로세스는 종종 죽지 않습니다. 글쎄, 종종 Windows에서, 때로는 Linux에서 샷건으로 촬영할 때까지는 아닙니다. 아니면 셧다운입니까? 그러나 실수로 보류중인 Windows 업데이트가 적용되는 것을주의하십시오.

디버거와 연결을 제안한 이전 답변 중 일부에 흥분했지만 위의 결과는 내가 얻은 결과입니다. 그래서 프로세스 테이블을 정리하기 위해 답변을 제출하고 재부팅합니다.


답변

여기에 인용 된 도구 중 일부를 살펴보면 답을 얻을 수 있습니까?

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

(지금은 pskill이 한 사용자의 Windows 7 세션에서 실행되는 프로세스를 다른 사용자의 세션 (또는 자격 증명)에서 죽일 수있는 유일한 도구라는 것을 알았습니다.