때때로 Windows가 프로세스를 종료 할 수없는 이유는 무엇입니까?


30

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

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

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

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


10
매번 니켈 만 가지고 있다면이 질문에 대한 답을 원했습니다 ...
Steven Oxley

3
답변을 주셔서 감사하지만 운영 체제 개발자가이 시대의 OS가 비 코어 / 커널 (또는 형용사가 적절한) 프로세스를 종료 할 수없는 이유를 설명하고 싶습니다. 386 이후 다른 코드보다 특별한 코드를 부여하는 "ring 0"(또는 비슷한 것)이 있다고 믿었 기 때문에 (OS) 프로세스가 다른 코드에 대한 권한을 갖는 방식이라고 생각했습니다. 어쩌면 내가 완전히 틀렸을 수도 있지만 질문에 대답하지 않은 채 남아 있습니다.
Néstor Sánchez A.

답변:


21

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

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


이것은 Linux에서도 발생합니다. x86 아키텍처에는 4 개의 링이 있지만 그 중 2 개만 사용됩니다 (사용자 공간의 경우 링 3, 커널의 경우 링 0). 따라서 모든 것은 커널 모드 또는 사용자 공간이며 그 사이에는 아무것도 없습니다. 그러나 가능한 해결 방법은 사용자 공간 코드를 호출하는 작고 안정적인 커널 모드 스텁에 의존하는 "사용자 모드"드라이버입니다. Windows에서 대부분의 인쇄 및 USB 드라이버가이 드라이버 (Windows 3.1에서 사용되었던 그래픽 드라이버)라고 생각하지만 사용자 공간에는 성능이 저하됩니다.
LawrenceC

업계 (인텔, AMD, ARM 등)가 프로세스를 죽이고이 문제를 한 번 그리고 영원히 제거 할 수있는 실질적인 기능을 사용자에게 제공하기위한 "메타 링"을 만들 수 없었습니다. ????
Néstor Sánchez A.

16

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

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


3
디버거가 연결되어 있는지와 어떤 프로세스가 연결되어 있는지 어떻게 알 수 있습니까? 난 아무것도 디버깅 아니에요하지만 작업이 아닌 작업 관리자로, 죽지 않을 것이기 때문에하지으로 서비스를 중지하지 않을 경우, taskkill /f함께,하지 wmic ... call terminate가 "말을 계속 ... 오류 : PID Y와 프로세스 X가 종료 할 수 없습니다 이 작업의 실행중인 인스턴스가 없습니다. "
Luc

3

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


3

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


2

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

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


2

저의 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 업데이트가 적용되는 것을주의하십시오.

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


고마워, 이것은 확실히 내 문제와 일치하는 가장 좋은 대답입니다.
Pablo Ariel


-1

당신은 할 수 있습니다!

ProcessHacker 사용 (프로세스를 마우스 오른쪽 버튼으로 클릭)-> 터미네이터.


-1

VS를 사용하여 프로세스를 디버그하고 작업 관리자로 프로세스를 종료하면 VS가 처리를 잘 수행 할 수 없습니다.

VS는 여전히 대상 프로세스를 디버깅하고 있지만 VS에서 중지 프로세스를 누를 수는 없습니다 .VS를 종료하면 프로세스가 종료됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.