เหตุใดบางครั้ง Windows ไม่สามารถฆ่ากระบวนการ


30

ตอนนี้ฉันกำลังพยายามเรียกใช้ / ดีบักแอปพลิเคชันของฉันใน Visual Studio แต่ไม่สามารถสร้างได้เนื่องจากอินสแตนซ์สุดท้ายของapp.vshost.exeยังคงทำงานอยู่ จากนั้นโดยใช้ตัวจัดการงานฉันพยายามที่จะฆ่ามัน แต่มันก็ยังคงอยู่ที่นั่นโดยไม่มีสัญญาณของกิจกรรม

นอกเหนือจากกรณีเฉพาะ (อาจเป็นข้อบกพร่องของ Visual Studio) ฉันอยากรู้มากเกี่ยวกับเหตุผลทางเทคนิคว่าทำไมบางครั้ง Windows ไม่สามารถฆ่ากระบวนการได้?

ผู้พัฒนาที่เกี่ยวข้องกับระบบปฏิบัติการที่รู้แจ้งได้โปรดลองอธิบายไหม?

(และโปรดอย่าเริ่มการต่อสู้ Unix / Linux / Mac กับ Windows)


10
ถ้าฉันมีเพียงนิกเกิลสำหรับทุกครั้งที่ฉันต้องการคำตอบของคำถามนี้ ...
สตีเว่นออกซ์ลีย์

3
ฉันขอขอบคุณคำตอบ แต่ฉันต้องการอ่านผู้พัฒนาระบบปฏิบัติการที่อธิบายว่าเหตุใดระบบปฏิบัติการในยุคนี้จึงไม่สามารถฆ่ากระบวนการที่ไม่ใช่คอร์ / เคอร์เนล (หรือคำคุณศัพท์ที่เหมาะสม) กระบวนการ ฉันเชื่อว่าตั้งแต่ 386 มี "วงแหวน 0" (หรือบางสิ่งบางอย่างเหมือนกัน) ให้สิทธิพิเศษกับรหัสบางอย่างมากกว่าคนอื่นฉันคิดว่านั่นเป็นวิธีที่กระบวนการ (OS) มีอำนาจเหนือผู้อื่น บางทีฉันผิดอย่างสมบูรณ์ แต่คำถามยังไม่ได้ตอบ
NéstorSánchez A.

คำตอบ:


21

สาเหตุมักเป็นไดรเวอร์ที่ไม่ตอบสนองซึ่งมีคำขอI / O ที่ยังไม่เสร็จ

ดูรายการบล็อกของ Mark Russinovich Unkillable Processes ( ไฟล์เก็บถาวร )


สิ่งนี้เกิดขึ้นใน Linux เช่นกัน ในขณะที่สถาปัตยกรรม x86 มี 4 วงเพียงสองคนเท่านั้นที่ใช้ (แหวน 3 สำหรับผู้ใช้พื้นที่ 0 แหวนสำหรับเคอร์เนล) ดังนั้นทุกอย่างเป็นโหมดเคอร์เนลหรือพื้นที่ผู้ใช้ไม่มีอะไรอยู่ระหว่าง แต่วิธีแก้ปัญหาที่เป็นไปได้คือไดรเวอร์ "โหมดผู้ใช้" ซึ่งขึ้นอยู่กับสตับโหมดเคอร์เนลขนาดเล็กที่เชื่อถือได้ซึ่งเรียกรหัสผู้ใช้เพียงอย่างเดียว ฉันเชื่อว่าไดรเวอร์การพิมพ์และ USB ส่วนใหญ่ใน Windows เป็นเช่นนี้ (ไดรเวอร์กราฟิกที่เคยเป็นใน Windows 3.1) แต่ userspace มีโทษประสิทธิภาพ
LawrenceC

อุตสาหกรรมไม่สามารถ (Intel, AMD, ARM และอื่น ๆ ) สร้าง "meta-ring" เพื่อมอบให้กับผู้ใช้ (ในความเสี่ยงของตัวเอง) ในที่สุดความสามารถที่แท้จริงของการฆ่ากระบวนการและกำจัดปัญหานี้ครั้งแล้วครั้งเล่า ????
NéstorSánchez A.

16

เหตุผลหนึ่งที่เป็นไปได้: คุณไม่สามารถฆ่าภารกิจที่แนบกับดีบักเกอร์ได้

วิธีเดียวที่จะหยุดงานได้จากตัวดีบัก


3
ฉันจะทราบได้อย่างไรว่ามีการเชื่อมต่อดีบักเกอร์และกระบวนการใดที่เชื่อมต่ออยู่ เพราะฉันไม่ได้ดีบั๊ก แต่งานจะไม่ตายไม่ใช่กับตัวจัดการงานไม่ใช่เมื่อหยุดบริการไม่ใช่ด้วยtaskkill /fไม่ใช่ด้วยwmic ... call terminate... มันคอยบอกว่า "ข้อผิดพลาด": กระบวนการ X กับ pid Y ไม่สามารถยกเลิกได้ ไม่มีอินสแตนซ์ที่ทำงานอยู่ของงานนี้ "
ลัค

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 ตัดสายสะดือดังนั้นตอนนี้คุณมีกระบวนการซอมบี้สองกระบวนการ คุณไม่สามารถแนบตัวดีบักเกอร์กับกระบวนการที่คุณกำลังดีบักได้เนื่องจากมีตัวดีบักเกอร์ (zombie) อยู่แล้วและคุณไม่สามารถแนบตัวดีบักกับ debugger (zombie) ได้เนื่องจากเนื่องจาก Visual Studio จะบอกคุณเมื่อคุณลอง :

ไม่สามารถแนบกับกระบวนการ การดำเนินการไม่ถูกกฎหมายในสถานะปัจจุบัน

ซอมบี้ยังอยู่ในตารางกระบวนการอย่างเพียงพอเพื่อป้องกันไม่ให้คุณเรียกใช้อินสแตนซ์อื่นผ่านตัวดีบั๊ก แต่คุณสามารถเริ่มต้นอินสแตนซ์อื่นนอก IDE ได้

สิ่งนี้ระบุถึงปัญหาที่เฉพาะเจาะจงมากขึ้นในการมี VS สร้างกระบวนการซอมบี้ แต่กระบวนการซอมบี้มักจะไม่ตาย บ่อยครั้งบน Windows บางครั้งบน Linux ไม่ใช่จนกว่าคุณจะยิงด้วยปืนลูกซอง หรือว่าเป็นการปิดระบบ? แต่ระวังแอปพลิเคชันโดยไม่ตั้งใจของการอัปเดต Windows ที่ค้างอยู่

ฉันรู้สึกตื่นเต้นกับคำตอบก่อนหน้านี้บางข้อที่เสนอแนะให้แนบกับดีบักเกอร์ แต่ข้างบนคือผลลัพธ์ที่ฉันได้รับ ดังนั้นฉันจึงส่งคำตอบและเริ่มระบบใหม่เพื่อล้างตารางกระบวนการ


ขอบคุณนี่เป็นคำตอบที่ดีที่สุดที่ตรงกับปัญหาของฉัน
Pablo Ariel

1

บางทีการตรวจสอบเครื่องมือบางอย่างที่อ้างถึงที่นี่อาจนำไปสู่คำตอบ?

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

(ตอนนี้ฉันพบว่า pskill เป็นเครื่องมือเดียวที่สามารถฆ่ากระบวนการที่ทำงานภายใต้เซสชัน Windows 7 ของผู้ใช้รายหนึ่งจากเซสชันของผู้ใช้รายอื่น (หรือฉันรับรอง)



-1

หากคุณใช้ VS เพื่อดีบักกระบวนการและคุณจัดการกับตัวจัดการงานจากนั้น VS จะจัดการกับมันไม่ดี

ดังนั้น VS ยังคงทำการดีบั๊กกระบวนการเป้าหมาย แต่คุณไม่สามารถกดหยุดกระบวนการใน VS เพียงแค่ออกจาก VS ของคุณและคุณจะเห็นกระบวนการของคุณออก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.