Tại sao đôi khi Windows không thể giết chết một quá trình?


30

Ngay bây giờ tôi đang cố gắng chạy / gỡ lỗi ứng dụng của mình trong Visual Studio, nhưng nó không thể tạo ra nó vì phiên bản cuối cùng của app.vshost.exenó vẫn đang chạy. Sau đó, bằng cách sử dụng Trình quản lý tác vụ, tôi đang cố gắng giết nó, nhưng nó vẫn ở đó mà không có tín hiệu hoạt động.

Ngoài trường hợp cụ thể đó (có thể là lỗi Visual Studio), tôi rất tò mò về lý do kỹ thuật tại sao đôi khi Windows không thể giết chết một quy trình?

Có thể, một nhà phát triển liên quan đến hệ điều hành khai sáng, xin vui lòng giải thích?

(Và làm ơn đừng bắt đầu cuộc chiến Unix / Linux / Mac với Windows.)


10
Nếu tôi chỉ có một chiếc niken cho mỗi lần tôi muốn câu trả lời cho câu hỏi này ...
Steven Oxley

3
Tôi đánh giá cao câu trả lời, nhưng tôi muốn đọc một nhà phát triển Hệ điều hành giải thích lý do tại sao một hệ điều hành trong thời đại này có thể giết chết một quy trình không cốt lõi / nhân (hoặc bất kỳ tính từ nào phù hợp). Tôi tin rằng từ năm 386, có một "vòng 0" (hoặc một cái gì đó tương tự) mang lại những đặc quyền đặc biệt cho một số mã khác, tôi nghĩ đó là cách mà một quá trình (HĐH) có thẩm quyền đối với người khác. Có lẽ tôi hoàn toàn sai, nhưng câu hỏi vẫn chưa được trả lời.
Néstor Sánchez A.

Câu trả lời:


21

Nguyên nhân thường là một số trình điều khiển không phản hồi có tiến trình yêu cầu I / O chưa hoàn thành .

Xem mục nhập blog của Mark Russinovich Quy trình không thể phá hủy ( lưu trữ )


Điều này cũng xảy ra trong Linux. Trong khi kiến ​​trúc x86 có 4 vòng, chỉ có hai trong số chúng được sử dụng (vòng 3 cho không gian người dùng, vòng 0 cho kernel). Vì vậy, mọi thứ đều là chế độ kernel hoặc không gian người dùng, không có gì ở giữa. Nhưng, một cách giải quyết có thể là các trình điều khiển "chế độ người dùng" phụ thuộc vào một sơ khai chế độ nhân nhỏ đáng tin cậy mà chỉ gọi mã không gian người dùng. Tôi tin rằng hầu hết các trình điều khiển in và USB trong Windows là thế này (trình điều khiển đồ họa từng có trong Windows 3.1), nhưng không gian người dùng mang một hình phạt hiệu suất.
LawrenceC

Không thể ngành công nghiệp (Intel, AMD, ARM, v.v.) tạo ra một "siêu vòng tròn" để cuối cùng cung cấp cho người dùng (có nguy cơ của chính mình) khả năng thực sự giết chết một quá trình và thoát khỏi vấn đề này một lần và mãi mãi ????
Néstor Sánchez A.

16

Một lý do có thể: Bạn không thể giết một tác vụ gắn liền với trình gỡ lỗi.

Cách duy nhất để dừng nhiệm vụ là từ chính trình gỡ lỗi.


3
Làm thế nào để tôi biết liệu một trình gỡ lỗi được đính kèm và quá trình đó được đính kèm? Bởi vì tôi không gỡ lỗi bất cứ thứ gì nhưng nhiệm vụ sẽ không chết, không phải với trình quản lý tác vụ, không phải khi dừng dịch vụ, không taskkill /fphải với wmic ... call terminate... nó cứ nói "lỗi: quá trình X với pid Y không thể bị chấm dứt . Không có phiên bản đang chạy của nhiệm vụ này. "
Luc

3

Một lý do là bạn không được phép giết nó. Ví dụ: nếu quá trình đang chạy với tư cách quản trị viên và bạn là người dùng bình thường.


3

Mở trang Thuộc tính cho dự án, chuyển đến tab Gỡ lỗi và kiểm tra "Bật gỡ lỗi mã không được quản lý". Hoặc, bỏ chọn tùy chọn để sử dụng quy trình máy chủ.


2

Nếu app.vshost.exe cuối cùng vẫn chạy, chỉ cần kết nối với quá trình đó với trình gỡ lỗi.

Nên được tìm thấy trong menu trong Debug-> AttachToProcess sau đó chọn quy trình treo và kết nối với nó.


2

Kinh nghiệm phát triển cấp độ hệ điều hành duy nhất của tôi là ở trường học, nhưng tôi nghi ngờ những gì đang xảy ra là điều này (hoặc một cái gì đó tương tự):

Đã xảy ra lỗi khi chạy phiên bản cuối cùng mà trình gỡ lỗi đã cố xử lý, nhưng một số vấn đề khác khiến nó không thành công (có thể đã gặp phải xác nhận gỡ lỗi, nhưng trước khi bạn có thể nhấp vào hộp thoại để Hủy bỏ / Thử lại / Bỏ qua, một lỗi khác đã được kích hoạt , có thể do một con trỏ null). Kết quả, sau khi bạn ngừng gỡ lỗi, là trình gỡ lỗi vẫn đang chờ phản hồi của bạn đối với xác nhận gỡ lỗi đầu tiên, vì vậy nó sẽ không để quá trình chấm dứt. Nhưng sau đó, trình gỡ lỗi chấm dứt khi bạn ngừng gỡ lỗi (hoặc đã làm điều đó?), Biến quá trình thành zombie hoặc cây của nó thành zombie. Khi bạn cố gắng tiêu diệt quá trình zombie, một lỗi tương tự như vậy đã xảy ra, nhưng trình quản lý tác vụ đã không cho bạn biết về nó:

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.

Nếu bạn quyết định thử điều tương tự với cha mẹ (trong trường hợp của tôi thì cha mẹ là quá trình gỡ lỗi, msvsmon.exe), nó sẽ thất bại theo cách tương tự:

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.

Cha mẹ đã được IDE bắt đầu, nhưng IDE đã cắt dây rốn, vì vậy bây giờ bạn có hai quá trình zombie. Bạn không thể đính kèm trình gỡ lỗi vào quá trình bạn gỡ lỗi, vì đã có trình gỡ lỗi (zombie) được đính kèm và bạn không thể đính kèm trình gỡ lỗi vào trình gỡ lỗi (zombie) bởi vì, Visual Studio sẽ cho bạn biết khi bạn thử :

Không thể đính kèm vào quy trình. Một hoạt động không hợp pháp trong tình trạng hiện tại.

Các zombie vẫn còn trong bảng quy trình đủ tốt để ngăn bạn chạy một cá thể khác thông qua trình gỡ lỗi, nhưng có lẽ bạn có thể bắt đầu một phiên bản khác bên ngoài IDE tốt.

Điều này giải quyết vấn đề cụ thể hơn về việc VS tạo ra một quy trình zombie. Nhưng, quá trình zombie thường không chết. Chà, thường là trên Windows, đôi khi trên Linux, cho đến khi bạn bắn chúng bằng súng ngắn. Hay đó là một sự tắt máy? Nhưng hãy cẩn thận với ứng dụng tình cờ của các bản cập nhật Windows đang chờ xử lý.

Tôi đã rất phấn khích trước một số câu trả lời trước đó đề nghị đính kèm với trình gỡ lỗi, nhưng trên đây là kết quả mà tôi nhận được. Vì vậy, tôi đang gửi câu trả lời của mình và khởi động lại để dọn sạch bảng quy trình.


Cảm ơn, đây chắc chắn là câu trả lời tốt nhất phù hợp với vấn đề của tôi.
Pablo Ariel



-1

Nếu bạn đang sử dụng VS để gỡ lỗi quá trình và bạn giết nó bằng trình quản lý tác vụ. Sau đó, VS không thể xử lý tốt.

Vì vậy, VS vẫn đang gỡ lỗi cho quá trình đích nhưng bạn không thể nhấn dừng quá trình trong VS. Hãy thoát khỏi VS của bạn và bạn sẽ thấy quá trình thoát của mình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.