Bạn nên chẩn đoán lỗi như thế nào SEHException - Thành phần bên ngoài đã ném một ngoại lệ


86

Bất cứ khi nào người dùng báo cáo một lỗi chẳng hạn như

System.Runtime.InteropServices.SEHException - Thành phần bên ngoài đã ném một ngoại lệ?

Tôi là một lập trình viên có thể làm gì để xác định nguyên nhân không?

Tình huống: Một người dùng (sử dụng chương trình do công ty tôi viết) đã báo cáo lỗi này. Đây có thể là một lỗi duy nhất. Họ nói rằng trong tháng trước, máy tính đã hai lần 'ngừng hoạt động'. Tôi đã rút kinh nghiệm, không nên hiểu mô tả này theo nghĩa đen, vì nó thường có nghĩa là ai đó liên quan đến máy tính không hoạt động như mong đợi. Họ không thể cung cấp cho tôi thêm chi tiết và tôi không thể tìm thấy bất kỳ lỗi nào trong nhật ký. Do đó có thể có hoặc không có lỗi này.

Từ dấu vết ngăn xếp, lỗi thực sự là khi xây dựng một lớp không gọi trực tiếp bất kỳ mã tương tác nào, nhưng có lẽ phức tạp bởi thực tế là đối tượng có thể là một phần của danh sách được liên kết dữ liệu với DevExpress Grid.

Lỗi được 'bắt' bởi một quy trình ngoại lệ không được xử lý mà thường sẽ đóng chương trình, nhưng có một tùy chọn để bỏ qua và tiếp tục. Nếu họ chọn bỏ qua lỗi, thì chương trình tiếp tục hoạt động nhưng lỗi lại xảy ra khi quy trình này được chạy tiếp theo. Tuy nhiên, nó đã không xảy ra nữa sau khi đóng và khởi động lại ứng dụng của chúng tôi.

Máy tính được đề cập dường như không bị căng thẳng. Nó đang chạy Vista Business, có 2GB bộ nhớ và theo Task Manager thì chỉ sử dụng khoảng một nửa trong số đó với ứng dụng của chúng tôi chỉ khoảng 200Mb.

Có một phần thông tin khác có thể có liên quan hoặc không. Một phần khác của chương trình tương tự sử dụng thành phần của bên thứ ba, thành phần này thực sự là một trình bao bọc dotnet xung quanh một dll gốc và thành phần này có một vấn đề đã biết mà đôi khi, bạn gặp phải

Đã cố gắng đọc hoặc ghi bộ nhớ được bảo vệ. Đây thường là dấu hiệu cho thấy bộ nhớ khác bị hỏng

Các nhà sản xuất linh kiện nói rằng điều này đã được khắc phục trong phiên bản mới nhất của thành phần mà chúng tôi đang sử dụng trong nhà, nhưng điều này vẫn chưa được trao cho khách hàng.

Do hậu quả của lỗi là thấp (không có công việc nào bị mất và việc khởi động lại chương trình và quay lại vị trí cũ chỉ mất tối đa một phút) và cho rằng khách hàng sẽ sớm nhận được phiên bản mới (với bản cập nhật thứ ba- bên thành phần), tôi rõ ràng có thể vượt qua ngón tay của mình và hy vọng lỗi sẽ không xảy ra nữa.

Nhưng tôi có thể làm được gì hơn không?

Câu trả lời:


28

Đúng. Lỗi này là một ngoại lệ có cấu trúc không được ánh xạ thành lỗi .NET. Nó có thể là ánh xạ DataGrid của bạn ném ra một ngoại lệ gốc mà không cần thiết.

Bạn có thể biết ngoại lệ nào đang xảy ra bằng cách xem thuộc tính ExternalException.ErrorCode . Tôi sẽ kiểm tra dấu vết ngăn xếp của bạn và nếu nó được liên kết với lưới DevExpress, hãy báo cáo vấn đề cho họ.


1
StackTrace không đề cập đến DevExpress ở bất cứ đâu, mà chỉ là lớp học của tôi. Sẽ phải kiểm tra xem Mã lỗi là gì.
sgmoore

Trong trường hợp đó, hãy cố gắng tìm ra chính xác điều gì đã tạo ra thông báo lỗi.
Reed Copsey

4
"bằng cách xem thuộc tính ExternalException.ErrorCode" - bạn có gợi ý nào về cách chính xác để thực hiện điều đó không? VS hiển thị cho tôi "Một ngoại lệ không được xử lý của loại 'System.Runtime.InteropServices.SEHException' đã xảy ra trong .... dll Thông tin bổ sung: Eine externe Komponente hat eine Ausnahme ausgelöst.", Nhưng khác với các ứng dụng C #, không có liên kết nào để xem "Chi tiết" của đối tượng ngoại lệ ở bất kỳ đâu.
HOẶC Mapper

8

Tôi đã gặp sự cố tương tự với một SEHException đã được ném ra khi chương trình của tôi lần đầu tiên sử dụng trình bao bọc dll gốc. Hóa ra là thiếu DLL gốc cho trình bao bọc đó. Ngoại lệ không có ích gì trong việc giải quyết vấn đề này. Điều gì đã giúp ích cuối cùng là chạy procmon trong nền và kiểm tra xem có bất kỳ lỗi nào khi tải tất cả các tệp DLL cần thiết hay không.


5

nếu bạn đang gặp vấn đề như mô tả trong bài đăng này:

trình gỡ lỗi asp.net mvc ném SEHException

thì giải pháp là:

nếu bạn có bất kỳ ứng dụng nào từ Trusteer (như rapport hoặc bất cứ thứ gì) chỉ cần gỡ cài đặt và khởi động lại hệ thống của bạn, nó sẽ hoạt động tốt ... tìm thấy giải pháp này ở đây:

http://forums.asp.net/t/1704958.aspx/8/10?Re+SEHException+thrown+when+I+run+the+application


3

Các nhà sản xuất linh kiện nói rằng điều này đã được khắc phục trong phiên bản mới nhất của thành phần mà chúng tôi đang sử dụng trong nhà, nhưng điều này vẫn chưa được trao cho khách hàng.

Hỏi nhà sản xuất thành phần cách kiểm tra xem vấn đề mà khách hàng đang gặp phải có phải là vấn đề mà họ nói rằng họ đã khắc phục trong phiên bản mới nhất của họ hay không mà không có / trước khi triển khai phiên bản mới nhất của họ cho khách hàng.


1

Tôi đã gặp lỗi này khi ứng dụng nằm trên mạng chia sẻ và thiết bị (máy tính xách tay, máy tính bảng, ...) bị ngắt kết nối khỏi mạng trong khi ứng dụng đang được sử dụng. Trong trường hợp của tôi, đó là do máy tính bảng Surface nằm ngoài phạm vi không dây. Không có vấn đề gì sau khi cài đặt WAP tốt hơn.


1
Tôi đã nhận được nó một cách ngẫu nhiên khi truy cập các loại phản ánh khác nhau (GetAssemblyName, GetProperty, Activator, v.v.) cả trong mã của tôi và thư viện bên thứ ba, và chỉ trong một môi trường khách hàng, tương tự như với các thư viện trên vị trí từ xa. Nhiều bằng chứng cho thấy đó là lỗi khung .net.
Andriy K,

Andriy K: Tôi không nghĩ đây là sự cố .NET, tôi nghĩ rằng các tay cầm của (các) tệp đã mở trên mạng chia sẻ bị mất \ rớt bằng cách nào đó, có thể là lỗi trong Windows hoặc sự cố mạng. Các tập hợp được ánh xạ bộ nhớ và sẽ được phân trang từ đĩa theo yêu cầu (bom hẹn giờ), có thể bộ nhớ cũng có thể bị loại bỏ trong tình huống bộ nhớ thấp. Nếu các xử lý tệp đã mở không ổn định, điều này có thể bốc khói. .NET có thể đã xử lý nó và mở lại tệp (giải quyết vấn đề), nhưng nó có thể phức tạp.
osexpert

Tôi có cùng một vấn đề. Tôi nhận được System.Runtime.InteropServices.SEHException (0x80004005) mà không có dấu vết ngăn xếp. Đây là ngoại lệ bên trong của một ngoại lệ TargetInvocationException. TargetInvocationException không có dấu vết ngăn xếp, nhưng nó không có ý nghĩa gì đối với tôi vì nó dường như đến từ main hoặc Application.Run. Nó xảy ra rất ngẫu nhiên, chủ yếu vào buổi tối. Tôi đoán "giải pháp" duy nhất là không chạy từ ổ đĩa mạng: - | Có lẽ tôi thêm một tấm séc có thể ngăn chặn tình huống này: stackoverflow.com/questions/8633680/...
osexpert

0

Chỉ là một thông tin khác ... Đã xảy ra sự cố hôm nay trên hệ thống Windows 2012 R2 x64 TS nơi ứng dụng được khởi động từ đường dẫn không / mạng. Sự cố đã xảy ra đối với một ứng dụng cho tất cả người dùng máy chủ đầu cuối. Việc thực thi ứng dụng cục bộ hoạt động mà không gặp vấn đề gì. Sau khi khởi động lại, nó bắt đầu hoạt động trở lại - SEHException được ném là Constructor init và TargetInvocationException


0

Cấu hình máy của tôi:

Hệ điều hành: Windows 10 Phiên bản 1703 (x64)

Tôi gặp phải lỗi này khi gỡ lỗi dự án C # .Net của mình trong phiên bản Cộng đồng Visual Studio 2017. Tôi đang gọi một phương thức gốc bằng cách thực hiện lệnh gọi p / trên một hợp ngữ C ++ được tải tại thời điểm chạy. Tôi đã gặp lỗi tương tự do OP báo cáo.

Tôi nhận ra rằng Visual Studio đã được khởi chạy với tài khoản người dùng không phải là quản trị viên trên máy. Sau đó, tôi khởi chạy lại Visual Studio dưới một tài khoản người dùng khác là quản trị viên trên máy. Đó là tất cả. Vấn đề của tôi đã được giải quyết và tôi không phải đối mặt với vấn đề này nữa.

Một điều cần lưu ý là phương thức được gọi trên hợp ngữ C ++ được cho là viết một vài thứ trong sổ đăng ký. Tôi đã không gỡ lỗi mã C ++ để thực hiện một số RCA nhưng tôi thấy có khả năng toàn bộ sự việc đã không thành công vì các đặc quyền quản trị được yêu cầu để viết sổ đăng ký trong hệ điều hành Windows 10. Vì vậy, trước đó khi Visual Studio đang chạy trong tài khoản người dùng không có đặc quyền quản trị trên máy, thì các cuộc gọi gốc không thành công.


0

Tôi gặp lỗi này khi chạy kiểm tra đơn vị trên bộ nhớ đệm inmemory mà tôi đang thiết lập. Nó làm ngập bộ nhớ cache. Sau khi vô hiệu hóa bộ nhớ cache và khởi động lại máy ảo, nó hoạt động tốt.

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.