Ứng dụng gặp sự cố với "Lỗi nội bộ trong .NET Runtime"


112

Chúng tôi có một ứng dụng được viết dựa trên .NET 4.0 bị lỗi vào cuối tuần, đưa thông báo sau vào nhật ký sự kiện:

Ứng dụng: PnrRetrieverService.exe Phiên bản khung: v4.0.30319
Mô tả: Quá trình đã bị chấm dứt do lỗi nội bộ trong .NET Runtime tại IP 791F9AAA (79140000) với mã thoát 80131506.

Đây là trên hộp Windows Server 2003 R2 Standard Edition. Googling lỗi này không hiển thị bất kỳ điều gì thích hợp. Ví dụ: điều này không xảy ra trong VS Studio mà thay vào đó là trên hộp sản xuất; khi dịch vụ cuối cùng được khởi động lại, nó không gặp sự cố nào nữa.

Làm cách nào để chẩn đoán lỗi trong .NET Runtime?


1
Nếu đây là lần đầu tiên lỗi này xảy ra, thì tôi sẽ xem xét mọi thứ đã thay đổi trong vài ngày đến một tuần qua.
Tony Abrams

Câu trả lời:


121

với mã thoát 80131506

Đó là một điều khó chịu, ExecutionEngineException. Bắt đầu với .NET 4.0, ngoại lệ này ngay lập tức chấm dứt chương trình. Nguyên nhân chung là tình trạng của đống rác được thu gom bị hỏng. Đến lượt nó, luôn luôn được gây ra bởi mã không được quản lý. Vị trí chính xác trong mã mà tại đó ngoại lệ này được nêu ra là không hữu ích, lỗi thường xảy ra trước khi thiệt hại được phát hiện.

Tìm ra nguyên nhân chính xác cho điều này sẽ rất khó khăn. Xem lại bất kỳ mã không được quản lý nào mà dịch vụ của bạn có thể đang sử dụng. Nghi ngờ các vấn đề môi trường nếu không có ứng cử viên rõ ràng, các máy quét phần mềm độc hại hoạt động sai rất khét tiếng. Nếu nó lặp lại rất kém thì nghi ngờ các vấn đề phần cứng như lỗi RAM mềm.


3
Tôi đã gặp sự cố với SQL CE 3.5 làm hỏng heap, gây ra các ngoại lệ trong lỗi thời gian chạy ntdll.dll và .NET.
Phil

4
Chúng được liệt kê trong tệp tiêu đề SDK CorError.h
Hans Passant

2
Làm thế nào bạn biết họ đã được liệt kê trong CorError.h ??
Yeonho

6
Sử dụng công cụ Err.exe này microsoft.com/en-au/download/details.aspx?id=985 để tìm ra mã lỗi hex như 80131506 có nghĩa là gì và tệp tiêu đề nào chứa chúng.
Jeremy Thompson

2
@HansPassant Tôi nghĩ câu hỏi dự định là 'về tất cả các tệp tồn tại trên thế giới, làm thế nào bạn biết rằng CorError.h là một tệp đáng để xem xét'?
bacar

41

Một lỗi trong việc triển khai đồng thời Bộ sưu tập rác trên x64 .Net 4 có thể gây ra lỗi này như đã nêu trong mục nhập microsoft KB sau:

ExecutionEngineException xảy ra trong quá trình thu gom rác

Trước tiên, bạn nên thực hiện thăm dò sâu sự cố nhỏ để chắc chắn rằng sự cố đã xảy ra trong quá trình Thu gom rác.

Vị trí thu nhỏ thường có thể được tìm thấy trong mục nhập Báo cáo lỗi Windows trong nhật ký sự kiện sau mục nhập sự cố. Sau đó, hãy vui vẻ với WinDbg!

Có thể tìm thấy tài liệu mới nhất về việc sử dụng <gcConcurrent/>phần tử cấu hình, để tắt tính năng thu gom rác nền đồng thời hoặc (trong .NET 4 trở lên) tại đây .


cảm ơn vì nhận xét này - đây là giải pháp cho vấn đề mà tôi đã gặp phải trong một thời gian dài!
lenniep

1
Bạn là một người tiết kiệm cuộc sống, đây là vấn đề đối với chúng tôi. Ngoài ra, bạn cũng có thể mở tệp minidump trong Visual Studio, thiết lập các đường dẫn biểu tượng nếu bạn cần và sau đó gỡ lỗi. Điều này cho chúng tôi biết rằng lỗi xảy ra tại clr.dll! WKS :: gc_heap :: mark_object_simple (). Tôi chắc rằng WinDbg rất mạnh mẽ nhưng việc sử dụng VS có thể cho bạn biết đủ nếu bạn chỉ đang xác minh nguồn gốc của lỗi.
Tim

Ứng dụng bị lỗi nhưng tôi không tìm thấy bất kỳ kết xuất nhỏ nào trong thư mục C: \ Temp \ CrashDump. Có một số bãi chứa va chạm khác ở đó và chúng ta có thể tìm thấy các bãi chứa từ các vụ tai nạn ngày trước. Bạn có biết tại sao không có bãi rác không? Thông báo lỗi và mã thoát hoàn toàn giống nhau.
Jeffrey Zhao,

Đây chính xác là những gì tôi đang tìm kiếm ... sự kiện crash ứng dụng có chứa một con trỏ hướng dẫn, điều này vô dụng đối với tôi nếu không có kết xuất. Không bao giờ nghĩ để tìm kiếm các sự kiện sau này. Cảm ơn bạn!
laindir

1
Đối với những người khác trong tình huống tương tự, có thể hữu ích khi định cấu hình Báo cáo lỗi Windows để thực hiện kết xuất toàn bộ đống khi gặp sự cố: msdn.microsoft.com/en-us/library/windows/desktop/…
laindir

9

Tôi đã gặp phải "lỗi nội bộ" trong thời gian chạy .NET hóa ra là do lỗi trong mã của tôi; Đừng nghĩ rằng chỉ vì đó là "lỗi nội bộ" trong thời gian chạy .NET mà không có lỗi trong mã của bạn là nguyên nhân gốc rễ. Luôn luôn luôn luôn đổ lỗi cho mã của bạn trước khi bạn đổ lỗi cho người khác.

Hy vọng rằng bạn có thông tin ghi nhật ký và theo dõi ngoại lệ / ngăn xếp để chỉ cho bạn nơi bắt đầu tìm kiếm hoặc bạn có thể lặp lại trạng thái của hệ thống trước khi gặp sự cố.



5

Sau nhiều năm vật lộn với vấn đề này trong một số ứng dụng, có vẻ như Microsoft cuối cùng đã chấp nhận nó là một lỗi trong .NET 4 CLR khiến điều này xảy ra. http://support.microsoft.com/kb/2640103 .

Trước đây, tôi đã "sửa" nó bằng cách buộc trình thu gom rác chạy ở chế độ máy chủ (gcServer enable = "true" trong app.config) như được mô tả trong bài viết của Microsoft được liên kết với Think Before Coding. Về bản chất, điều này buộc tất cả các luồng trong ứng dụng phải tạm dừng trong quá trình thu thập, loại bỏ khả năng các luồng khác truy cập vào bộ nhớ bị GC thao tác. Tôi rất vui khi thấy rằng nhiều năm trời tìm kiếm "lỗi" trong mã của tôi hoặc các thư viện không được quản lý của bên thứ ba vô ích chỉ không có kết quả vì lỗi nằm trong mã của Microsoft, không phải của tôi.


1
Số phiên bản của tệp HotFix bạn nhận được là gì? Số phiên bản được liệt kê trong KB là 4.0.30319.526 nhưng tôi đã có 4.0.30319.18052. HotFix vẫn cần thiết hay nó đã được đưa vào Windows Update?
Tự động hóa

1
Khi tôi chạy exe HotFix, tôi nhận được "KB2640103 không áp dụng hoặc bị chặn bởi một điều kiện khác trên máy tính của bạn."
Tự động hóa


3

Có cùng một lỗi chính xác trên hộp WinXP với bản dựng mới nhất của mã .NET 4 của tôi. Đã kiểm tra các bản dựng trước - bây giờ chúng cũng bị sập! Ok, vậy không phải là tôi :). Không có đề xuất nào ở đây / ở trên đã giúp.

Nhiều báo cáo gần đây (2018-05-09) về cùng một vấn đề: Sự cố ứng dụng với mã thoát 80131506 .

A : Chúng tôi đã nhận được một lỗi tương tự, nhưng chúng tôi tin rằng lỗi của chúng tôi là do trình tối ưu hóa bộ nhớ Citrix gây ra.
Giải pháp là buộc tái tạo các thư viện lõi .Net trên (các) máy chủ lưu trữ nơi xảy ra sự cố:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe update /force

Nguyên nhân gốc rễ vẫn chưa được biết (máy không được cập nhật và ít sử dụng), nhưng điều đó đã giúp tôi !


2

Trong trường hợp của tôi, ngoại lệ này đã xảy ra khi dung lượng đĩa hết và .NET không thể cấp phát bộ nhớ trong Bộ nhớ ảo của Windows.

Trong nhật ký sự kiện, tôi thấy lỗi này:

Ứng dụng bật lên: Windows - Bộ nhớ ảo Tối thiểu Quá thấp: Hệ thống của bạn sắp hết bộ nhớ ảo. Windows đang tăng kích thước tệp hoán trang bộ nhớ ảo của bạn. Trong quá trình này, yêu cầu bộ nhớ cho một số ứng dụng có thể bị từ chối.

Và lỗi trước đó:

Đĩa C: bằng hoặc gần dung lượng. Bạn có thể cần xóa một số tệp.


1

Trong trường hợp của tôi, vấn đề là thư viện C ++ / CLI trong đó có một lệnh gọi đến NtQuerySystemInformation ; vì một số lý do đôi khi (và trong những trường hợp bí ẩn ), khi nó được gọi là đống CLR đã bị hỏng và ứng dụng bị lỗi.

Tôi đã giải quyết sự cố bằng cách sử dụng "đống tùy chỉnh" được tạo bằng HeapCreate và phân bổ ở đó các bộ đệm được sử dụng bởi chức năng đó.


1

Tôi không chắc nó có thể giúp ích cho mọi người nhưng tôi có thể giải quyết vấn đề này bằng cách chạy

devenv.exe /ResetSettings 

... trong con đường {Visual_Studio_root}\Common7\Ide

Tôi đã gặp các lỗi sau trong nhật ký sự kiện và VS luôn gặp sự cố và khởi động lại:

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: 

Điều này cũng làm việc cho tôi. Bối cảnh: Tôi đã chuyển đổi một giải pháp cỡ trung bình (~ 25 dự án) sang .NET Core SDK, dẫn đầu bởi một Dự án Ứng dụng Web gần như trống rỗng thay thế WAP cũ trước khi chuyển đổi. Rõ ràng một số cài đặt kéo dài đang mâu thuẫn với kỳ vọng của IISExpress trong dự án mới.
Tomas Aschan

1

Trong trường hợp của tôi, vấn đề là do các chuyển hướng ràng buộc trùng lặp trong web.config của tôi. Thêm thông tin ở đây .

Tôi cho rằng đó là do NuGet sửa đổi các chuyển hướng ràng buộc, nhưng ví dụ: nó trông như thế này:

  <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>

Xóa tất cả các bản sao đã giải quyết được vấn đề.


0

Trong trường hợp của tôi, lỗi này xảy ra khi đăng nhập vào ứng dụng SAP Business One 9.1. Trong các sự kiện Windows, tôi cũng có thể tìm thấy một sự kiện lỗi khác ngoài sự kiện được OP báo cáo:

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: 

Máy chạy Windows 8.1, cài sẵn .NET Framework 4.0 và không có phiên bản 4.5. Có vẻ như từ Internet rằng nó cũng có thể là một lỗi trong .NET 4, tôi đã thử cài đặt .NET Framework 4.5.2 và tôi đã giải quyết được sự cố.


0

Phiên bản khung: v4.0.30319 Mô tả: Quá trình đã bị chấm dứt do một ngoại lệ chưa được xử lý. Thông tin ngoại lệ: System.Reflection.TargetInvocationException

Tôi đã gặp phải Lỗi này, Ứng dụng hoạt động tốt trên một số PC và trên một số PC gặp lỗi ở trên. Tôi gỡ cài đặt Framework 4.5 và cài đặt lại điều này đã giải quyết được sự cố của tôi.

Vui lên.


0

Đây có thể là một ngoại lệ xảy ra trong trình hoàn thiện. Nếu bạn đang thực hiện mẫu ~ Class () {Dispose (false); } kiểm tra những gì bạn đang xử lý dưới dạng tài nguyên không được quản lý. Chỉ cần thử ... nắm bắt ở đó và bạn sẽ ổn thôi.

Chúng tôi đã phát hiện ra vấn đề khi chúng tôi gặp phải sự cố bí ẩn này mà không có nhật ký nào. Chúng tôi đã thực hiện mô hình được khuyến nghị thông thường là sử dụng "void Dispose (bool vứt bỏ)".

Xem xét các câu trả lời cho câu hỏi này về trình hoàn thiện, chúng tôi đã tìm thấy một nơi có thể xảy ra mà việc Xử lý tài nguyên không được quản lý có thể tạo ra một ngoại lệ.

Hóa ra ở một nơi nào đó chúng tôi đã không xử lý đối tượng đúng cách, do đó, người hoàn thiện đã tiếp nhận việc nhúng các tài nguyên không được quản lý, do đó có một ngoại lệ xảy ra.

Trong trường hợp này là sử dụng Kafka Rest API để xóa máy khách khỏi Kafka. Có vẻ như nó đã ném ngoại lệ vào một số thời điểm sau đó sự cố này xảy ra.



0

Tôi không bao giờ hiểu tại sao điều này lại xảy ra với tôi. Nó liên tục có thể tái tạo cho một trong các ứng dụng của tôi, nhưng đã biến mất sau khi khởi động lại.

Tôi đang chạy Windows 2004 Build 19582.1001 (Insider Preview) với .net-4.8 và tôi cũng sẽ không ngạc nhiên nếu điều này là do lỗi bộ nhớ phần cứng. Ngoài ra, ứng dụng của tôi có tải một số mã không được quản lý và khởi tạo nó, vì vậy tôi không thể chứng minh rằng sự cố không đến từ điều đó.


-1

Cứ sau 5-10 phút, nhóm ứng dụng của tôi liên tục gặp sự cố với mã thoát này. Tôi không muốn hủy hoại lòng tin của bạn đối với Trình thu gom rác, nhưng giải pháp sau đây đã hiệu quả với tôi.

Tôi đã thêm một Công việc gọi GC.GetTotalMemory(true)mỗi phút.

Tôi cho rằng, vì lý do nào đó, GC không tự động kiểm tra bộ nhớ đủ thường xuyên cho số lượng lớn các đối tượng dùng một lần mà tôi sử dụng.

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.