แอปพลิเคชันขัดข้องด้วย“ ข้อผิดพลาดภายในในรันไทม์. NET”


112

เรามีแอปพลิเคชันที่เขียนต่อต้าน. NET 4.0 ซึ่งในช่วงสุดสัปดาห์ที่ผ่านมาขัดข้องโดยใส่ข้อความต่อไปนี้ลงในบันทึกเหตุการณ์:

แอ็พพลิเคชัน: PnrRetrieverService.exe Framework เวอร์ชัน: v4.0.30319
คำอธิบาย: กระบวนการนี้สิ้นสุดลงเนื่องจากข้อผิดพลาดภายในใน. NET Runtime ที่ IP 791F9AAA (79140000) พร้อมรหัสออก 80131506

สิ่งนี้อยู่ในกล่อง Windows Server 2003 R2 Standard Edition Googling ข้อผิดพลาดนี้ไม่ได้เปิดสิ่งที่เกี่ยวข้อง ตัวอย่างเช่นสิ่งนี้จะไม่เกิดขึ้นใน VS Studio แต่อยู่ในกล่องการผลิตแทน เมื่อเริ่มบริการใหม่ในที่สุดก็ไม่พบปัญหาใด ๆ อีก

จะไปเกี่ยวกับการวินิจฉัยจุดบกพร่องใน. NET Runtime ได้อย่างไร?


1
หากนี่เป็นครั้งแรกที่เกิดข้อผิดพลาดฉันจะตรวจสอบสิ่งที่เปลี่ยนแปลงในช่วงสองสามวันที่ผ่านมาถึงหนึ่งสัปดาห์
Tony Abrams

คำตอบ:


121

พร้อมรหัสทางออก 80131506

นั่นเป็นสิ่งที่น่ารังเกียจ ExecutionEngineException เริ่มต้นด้วย. NET 4.0 ข้อยกเว้นนี้จะยุติโปรแกรมทันที สาเหตุทั่วไปคือความเสียหายของสถานะของกองขยะที่เก็บรวบรวม ซึ่งมักเกิดจากรหัสที่ไม่มีการจัดการ ตำแหน่งที่แน่นอนในรหัสที่ยกข้อยกเว้นนี้ไม่เป็นประโยชน์ความเสียหายมักเกิดขึ้นก่อนที่จะตรวจพบความเสียหาย

การหาสาเหตุที่แท้จริงของสิ่งนี้จะเป็นเรื่องยาก ตรวจสอบโค้ดที่ไม่มีการจัดการที่บริการของคุณอาจใช้ สงสัยปัญหาด้านสิ่งแวดล้อมหากไม่มีผู้สมัครที่ชัดเจนเครื่องสแกนมัลแวร์ที่ทำงานผิดปกติจะเป็นที่โจษจัน หากทำซ้ำไม่ดีมากให้สงสัยว่าปัญหาฮาร์ดแวร์เช่นข้อผิดพลาดของซอฟต์แรม


3
ฉันมีปัญหากับ SQL CE 3.5 ที่ทำให้ฮีปเสียหายทำให้เกิดข้อยกเว้นในข้อผิดพลาดรันไทม์ ntdll.dll และ. NET
ฟิลิป

4
มีอยู่ในไฟล์ส่วนหัว SDK CorError.h
Hans Passant

2
คุณรู้ได้อย่างไรว่ามีรายชื่ออยู่ใน CorError.h ??
Yeonho

6
ใช้เครื่องมือ Err.exe นี้microsoft.com/en-au/download/details.aspx?id=985เพื่อหาว่ารหัสข้อผิดพลาดฐานสิบหกเช่น 80131506 หมายถึงอะไรและไฟล์ส่วนหัวใดมีอยู่
Jeremy Thompson

2
@HansPassant ฉันคิดว่าคำถามที่ตั้งใจไว้คือ 'ของไฟล์ทั้งหมดที่มีอยู่ในโลกคุณรู้ได้อย่างไรว่า CorError.h เป็นไฟล์ที่คุ้มค่าที่จะดู'?
bacar

41

ข้อผิดพลาดในการใช้งาน Garbage Collection บนx64 .Net 4 พร้อมกันอาจทำให้เกิดสิ่งนี้ตามที่ระบุไว้ในรายการ microsoft KB ต่อไปนี้:

ExecutionEngineException เกิดขึ้นระหว่างการรวบรวมขยะ

ก่อนอื่นคุณควรทำการสำรวจ minidump อย่างละเอียดเพื่อให้แน่ใจว่าปัญหาเกิดขึ้นระหว่างการเก็บขยะ

โดยปกติตำแหน่ง minidump สามารถพบได้ในรายการ Windows Error Reporting ในบันทึกเหตุการณ์หลังจากรายการข้อขัดข้อง จากนั้นขอให้สนุกกับ WinDbg!

เอกสารล่าสุดเกี่ยวกับการใช้งานของ<gcConcurrent/>องค์ประกอบการกำหนดค่าเพื่อปิดการใช้งานพร้อมกันหรือ (ใน .NET 4 และต่อมา) คอลเลกชันพื้นหลังขยะสามารถพบได้ที่นี่


ขอบคุณสำหรับความคิดเห็นนี้ - นี่คือทางออกสำหรับปัญหาที่ฉันมีมานานแล้ว!
lenniep

1
คุณเป็นผู้ช่วยชีวิตนี่เป็นปัญหาสำหรับเรา นอกจากนี้คุณยังสามารถเปิดไฟล์ minidump ใน Visual Studio ตั้งค่าเส้นทางสัญลักษณ์หากคุณต้องการจากนั้นดีบัก สิ่งนี้บอกเราว่าเกิดข้อผิดพลาดที่ clr.dll! WKS :: gc_heap :: mark_object_simple () ฉันแน่ใจว่า WinDbg มีประสิทธิภาพมาก แต่การใช้ VS สามารถบอกคุณได้เพียงพอหากคุณกำลังตรวจสอบแหล่งที่มาของข้อผิดพลาด
ทิม

แอปพลิเคชันขัดข้อง แต่ฉันไม่พบการทิ้งขนาดเล็กในโฟลเดอร์ C: \ Temp \ CrashDump มีจุดทิ้งข้อขัดข้องอื่น ๆ อยู่ที่นั่นและเราสามารถหาจุดทิ้งได้จากการขัดข้องเมื่อหลายวันก่อน คุณรู้หรือไม่ว่าเหตุใดจึงไม่มีการทิ้งขยะ ข้อความแสดงข้อผิดพลาดและรหัสทางออกเหมือนกันทุกประการ
Jeffrey Zhao

นี่คือสิ่งที่ฉันกำลังมองหา ... เหตุการณ์ความผิดพลาดของแอปมีตัวชี้คำสั่งซึ่งไม่มีประโยชน์สำหรับฉันหากไม่มีการถ่ายโอนข้อมูล ไม่เคยคิดที่จะมองหาเหตุการณ์ในภายหลัง ขอบคุณ!
laindir

1
สำหรับคนอื่น ๆ ที่อยู่ในสถานการณ์เดียวกันอาจเป็นประโยชน์ในการกำหนดค่า Windows Error Reporting เพื่อทำการถ่ายโอนข้อมูลแบบเต็มเมื่อเกิดข้อขัดข้อง: msdn.microsoft.com/en-us/library/windows/desktop/…
laindir

9

ฉันพบ "ข้อผิดพลาดภายใน" ในรันไทม์. NET ซึ่งเกิดจากข้อบกพร่องในโค้ดของฉัน อย่าคิดว่าเพียงเพราะมันเป็น "ข้อผิดพลาดภายใน" ในรันไทม์. NET ที่ไม่มีจุดบกพร่องในโค้ดของคุณเป็นสาเหตุ มักจะโทษรหัสของตัวเองเสมอก่อนที่จะตำหนิคนอื่น

หวังว่าคุณจะมีข้อมูลการบันทึกและการติดตามข้อยกเว้น / สแต็กเพื่อชี้ให้คุณทราบว่าจะเริ่มค้นหาที่ไหนหรือว่าคุณสามารถทำซ้ำสถานะของระบบก่อนที่จะเกิดความผิดพลาด


7

สำหรับผู้ที่มาที่นี่จาก google ในที่สุดฉันก็เจอคำถาม SO นี้และคำตอบเฉพาะนี้ช่วยแก้ปัญหาของฉันได้ ฉันได้ติดต่อ Microsoft สำหรับโปรแกรมแก้ไขด่วนผ่านการแชทสดบนsupport.microsoft.comและพวกเขาส่งลิงก์ไปยังโปรแกรมแก้ไขด่วนทางอีเมลให้ฉัน


5

หลังจากหลายปีของการต่อสู้กับปัญหานี้ในหลายแอปพลิเคชันปรากฏว่าในที่สุด Microsoft ก็ยอมรับว่าเป็นจุดบกพร่องใน. NET 4 CLR ซึ่งทำให้เกิดปัญหานี้ขึ้น http://support.microsoft.com/kb/2640103

ก่อนหน้านี้ฉันได้ทำการ "แก้ไข" โดยบังคับให้ตัวรวบรวมขยะทำงานในโหมดเซิร์ฟเวอร์ (เปิดใช้งาน gcServer = "true" ใน app.config) ตามที่อธิบายไว้ในบทความของ Microsoft ที่เชื่อมโยงโดย Think Before Coding สิ่งนี้บังคับให้เธรดทั้งหมดในแอปพลิเคชันหยุดชั่วคราวระหว่างการรวบรวมเพื่อลบความเป็นไปได้ของเธรดอื่นที่เข้าถึงหน่วยความจำที่ GC จัดการ ฉันมีความสุขที่พบว่าหลายปีของการค้นหา "จุดบกพร่อง" ในโค้ดของฉันโดยเปล่าประโยชน์หรือไลบรารีที่ไม่มีการจัดการของบุคคลที่สามอื่น ๆ นั้นไร้ผลเพียงเพราะข้อบกพร่องอยู่ในโค้ดของ Microsoft ไม่ใช่ของฉัน


1
หมายเลขเวอร์ชันของไฟล์ HotFix ที่คุณได้รับคืออะไร หมายเลขเวอร์ชันที่แสดงใน KB คือ 4.0.30319.526 แต่ฉันมี 4.0.30319.18052 แล้ว ยังจำเป็นต้องใช้โปรแกรมแก้ไขด่วนหรือถูกนำไปใช้ใน Windows Update หรือไม่
อัตโนมัติ

1
เมื่อฉันเรียกใช้โปรแกรมแก้ไขด่วน exe ฉันได้รับ "KB2640103 ใช้ไม่ได้หรือถูกปิดกั้นโดยเงื่อนไขอื่นบนคอมพิวเตอร์ของคุณ"
อัตโนมัติ


3

มีข้อผิดพลาดเดียวกันกับกล่อง WinXP พร้อมกับรหัส. NET 4 ล่าสุดของฉัน ตรวจสอบงานสร้างก่อนหน้า - ตอนนี้พวกเขาพังเช่นกัน! โอเคไม่ใช่ฉัน :) ไม่มีคำแนะนำที่นี่ / ด้านบนช่วย

มากเมื่อเร็ว ๆ นี้ (2018/05/09) รายงานปัญหาเดียวกัน: การประยุกต์ใช้ความผิดพลาดด้วยรหัสทางออก 80131506

ตอบ : เราได้รับข้อผิดพลาดที่คล้ายกัน แต่เราเชื่อว่าเกิดจากเครื่องมือเพิ่มประสิทธิภาพหน่วยความจำ Citrix
การแก้ปัญหาคือการบังคับให้มีการสร้างใหม่ของไลบรารีหลัก. Net บนโฮสต์ที่เกิดปัญหา:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe update /force

ยังไม่ทราบสาเหตุที่แท้จริง (เครื่องไม่ได้รับการอัปเดตและมีการใช้งานน้อย) แต่สำหรับฉัน !


2

ในกรณีของฉันข้อยกเว้นนี้เกิดขึ้นเมื่อเนื้อที่ดิสก์สิ้นสุดลงและ. NET ไม่สามารถจัดสรรหน่วยความจำในหน่วยความจำเสมือนของ Windows

ในบันทึกเหตุการณ์ฉันเห็นข้อผิดพลาดนี้:

ป๊อปอัปแอปพลิเคชัน: Windows - หน่วยความจำเสมือนต่ำสุดต่ำเกินไป: ระบบของคุณมีหน่วยความจำเสมือนเหลือน้อย Windows กำลังเพิ่มขนาดของไฟล์เพจหน่วยความจำเสมือนของคุณ ในระหว่างกระบวนการนี้คำขอหน่วยความจำสำหรับบางแอปพลิเคชันอาจถูกปฏิเสธ

และข้อผิดพลาดก่อนหน้านี้:

ดิสก์ C: อยู่ที่หรือใกล้ความจุ คุณอาจต้องลบไฟล์บางไฟล์


1

ในกรณีของปัญหาคือห้องสมุด C ++ / CLI ซึ่งในนั้นมีการเรียกร้องให้มีNtQuerySystemInformation ; ด้วยเหตุผลบางอย่างในบางครั้ง (และภายใต้สถานการณ์ลึกลับ ) เมื่อเรียกว่าฮีป CLR ได้รับความเสียหายและแอปพลิเคชันขัดข้อง

ฉันได้แก้ไขปัญหาโดยใช้ "ฮีปแบบกำหนดเอง" ที่สร้างด้วยHeapCreateและจัดสรรบัฟเฟอร์ที่ฟังก์ชันนั้นใช้


1

ฉันไม่แน่ใจว่ามันอาจช่วยทุกคนได้ แต่ฉันสามารถหลีกเลี่ยงสิ่งนี้ได้ด้วยการวิ่ง

devenv.exe /ResetSettings 

... ในเส้นทาง {Visual_Studio_root}\Common7\Ide

ฉันมีข้อผิดพลาดต่อไปนี้ในบันทึกเหตุการณ์และ VS เพิ่งหยุดทำงานและรีสตาร์ทตลอดเวลา:

Faulting application name: devenv.exe, version: 14.0.25123.0, time stamp: 0x56f22f32
Faulting module name: clr.dll, version: 4.7.2115.0, time stamp: 0x59af88f2
Exception code: 0xc0000005
Fault offset: 0x0015f90e
Faulting process id: 0x3a7c
Faulting application start time: 0x01d353463eaf0c36
Faulting application path: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe
Faulting module path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Report Id: a232f984-6e80-4f61-9003-e18a035c8f93
Faulting package full name: 
Faulting package-relative application ID: 

สิ่งนี้ได้ผลสำหรับฉันด้วย บริบท: ฉันได้แปลงโซลูชันขนาดกลาง (~ 25 โปรเจ็กต์) เป็น. NET Core SDK ซึ่งนำหน้าด้วย Web Application Project ที่เกือบจะว่างเปล่าซึ่งแทนที่ WAP เก่าก่อนการแปลง เห็นได้ชัดว่าการตั้งค่าที่ค้างอยู่บางอย่างขัดกับความคาดหวังของ IISExpress ในโครงการใหม่
Tomas Aschan

1

ในกรณีของฉันปัญหาเกิดจากการเปลี่ยนเส้นทางการเชื่อมโยงซ้ำใน web.config ของฉัน ข้อมูลเพิ่มเติมที่นี่ที่นี่

ฉันคิดว่าเป็นเพราะ NuGet แก้ไขการเปลี่ยนเส้นทางที่มีผลผูกพัน แต่ตัวอย่างเช่นมันมีลักษณะดังนี้:

  <dependentAssembly>
    <assemblyIdentity name="Lucene.Net" publicKeyToken="85089178b9ac3181"/>
    <bindingRedirect oldVersion="0.0.0.0-2.9.4.0" newVersion="3.0.3.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"/>
    <bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Lucene.Net" publicKeyToken="85089178b9ac3181"/>
    <bindingRedirect oldVersion="0.0.0.0-2.9.4.0" newVersion="3.0.3.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"/>
    <bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0"/>
  </dependentAssembly>

การลบรายการที่ซ้ำกันทั้งหมดช่วยแก้ปัญหาได้


0

ในกรณีของฉันข้อผิดพลาดนี้เกิดขึ้นเมื่อเข้าสู่ระบบแอปพลิเคชัน SAP Business One 9.1 ในเหตุการณ์ Windows ฉันสามารถพบเหตุการณ์ข้อผิดพลาดอื่นนอกเหนือจากเหตุการณ์ที่รายงานโดย OP:

Nome dell'applicazione che ha generato l'errore: SAP Business One.exe, versione: 9.10.160.0, timestamp: 0x551ad316
Nome del modulo che ha generato l'errore: clr.dll, versione: 4.0.30319.34014, timestamp: 0x52e0b784
Codice eccezione: 0xc0000005
Offset errore 0x00029f55
ID processo che ha generato l'errore: 0x1d7c
Ora di avvio dell'applicazione che ha generato l'errore: 0x01d0e6f4fa626e78
Percorso dell'applicazione che ha generato l'errore: C:\Program Files (x86)\SAP\SAP Business One\SAP Business One.exe
Percorso del modulo che ha generato l'errore: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
ID segnalazione: 3fd8e0e7-52e8-11e5-827f-74d435a9d02c
Nome completo pacchetto che ha generato l'errore: 
ID applicazione relativo al pacchetto che ha generato l'errore: 

เครื่องรัน Windows 8.1 โดยติดตั้ง. NET Framework 4.0 และไม่มีเวอร์ชัน 4.5 เนื่องจากดูเหมือนว่าจากอินเทอร์เน็ตอาจเป็นข้อผิดพลาดใน. NET 4 ฉันจึงลองติดตั้ง. NET Framework 4.5.2และฉันแก้ไขปัญหาได้


0

เวอร์ชันของเฟรมเวิร์ก: v4.0.30319 คำอธิบาย: กระบวนการถูกยกเลิกเนื่องจากข้อยกเว้นที่ไม่สามารถจัดการได้ ข้อมูลข้อยกเว้น: System.Reflection.TargetInvocationException

ฉันประสบกับข้อผิดพลาดนี้แอปพลิเคชันทำงานได้ดีบนพีซีบางเครื่องและในพีซีบางเครื่องให้ข้อผิดพลาดข้างต้น ฉันถอนการติดตั้ง Framework 4.5 และติดตั้งใหม่สิ่งนี้ช่วยแก้ปัญหาของฉันได้

เชียร์


0

นี่อาจเป็นข้อยกเว้นที่เกิดขึ้นใน Finalizer หากคุณกำลังทำ Pattern ของ ~ Class () {Dispose (false); } ตรวจสอบว่าคุณกำลังกำจัดอะไรเป็นทรัพยากรที่ไม่มีการจัดการ แค่ลอง .. จับตรงนั้นแล้วคุณจะสบายดี

เราพบปัญหาเนื่องจากเราประสบความล้มเหลวอย่างลึกลับนี้โดยไม่มีบันทึกเราใช้รูปแบบที่แนะนำตามปกติในการใช้ "void Dispose (การกำจัดแบบบูล)"

เมื่อดูคำตอบของคำถามเกี่ยวกับ Finalizer นี้เราพบสถานที่ที่เป็นไปได้ที่การกำจัดทรัพยากรที่ไม่มีการจัดการอาจทำให้เกิดข้อยกเว้นได้

ปรากฎว่ามีบางแห่งที่เราไม่ได้กำจัดวัตถุอย่างถูกต้องดังนั้น Finalizer จึงเข้ามาแทนที่ไดโพซัลของทรัพยากรที่ไม่มีการจัดการดังนั้นจึงมีข้อยกเว้นเกิดขึ้น

ในกรณีนี้คือการใช้ Kafka Rest API เพื่อล้างไคลเอนต์จาก Kafka ดูเหมือนว่าจะมีข้อยกเว้นในบางครั้งปัญหานี้ก็เกิดขึ้น


0

ในกรณีของฉันปัญหาเกี่ยวข้องกับ " การอ้างอิงไลบรารีมาตรฐาน. NET ในโครงการ asp.net แบบคลาสสิก " และปัญหาทั้งสองนี้

https://github.com/dotnet/standard/issues/873

https://github.com/App-vNext/Polly/issues/628

และการปรับลดรุ่นเป็น Polly v6 ก็เพียงพอที่จะแก้ปัญหาได้


0

ฉันไม่เคยคิดเลยว่าทำไมสิ่งนี้ถึงเกิดขึ้นกับฉัน สามารถทำซ้ำได้อย่างสม่ำเสมอสำหรับหนึ่งในแอปพลิเคชันของฉัน แต่หายไปหลังจากรีบูตเครื่อง

ฉันใช้ Windows 2004 Build 19582.1001 (Insider Preview) พร้อมกับ. net-4.8 และฉันก็ไม่แปลกใจเลยหากนี่เป็นเพราะข้อผิดพลาดของหน่วยความจำฮาร์ดแวร์ นอกจากนี้แอปพลิเคชันของฉันโหลดโค้ดที่ไม่มีการจัดการและเริ่มต้นใช้งานดังนั้นฉันจึงไม่สามารถพิสูจน์ได้ว่าความผิดพลาดนั้นไม่ได้มาจากสิ่งนั้น


-1

ทุกๆ 5-10 นาทีแอปพลิเคชันของฉันยังคงหยุดทำงานด้วยรหัสออก ฉันไม่ต้องการทำลายความไว้วางใจของคุณที่มีต่อ Garbage Collector แต่วิธีแก้ไขต่อไปนี้ใช้ได้ผลสำหรับฉัน

ฉันเพิ่มงานที่โทรGC.GetTotalMemory(true)ทุกนาที

ฉันคิดว่าด้วยเหตุผลบางประการ GC ไม่ได้ตรวจสอบหน่วยความจำโดยอัตโนมัติบ่อยพอสำหรับวัตถุที่ใช้แล้วทิ้งจำนวนมากที่ฉันใช้

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