คุณจะวินิจฉัยข้อผิดพลาด SEHException ได้อย่างไร - ส่วนประกอบภายนอกมีข้อยกเว้น


88

เมื่อใดก็ตามที่ผู้ใช้รายงานข้อผิดพลาดเช่น

System.Runtime.InteropServices.SEHException - องค์ประกอบภายนอกมีข้อยกเว้นหรือไม่

มีอะไรที่ฉันในฐานะโปรแกรมเมอร์สามารถทำได้เพื่อหาสาเหตุ?

สถานการณ์จำลอง: ผู้ใช้รายหนึ่ง (ใช้โปรแกรมที่ บริษัท ของฉันเขียน) ได้รายงานข้อผิดพลาดนี้ นี่อาจเป็นข้อผิดพลาดหรือไม่ก็ได้ พวกเขากล่าวว่าในเดือนที่แล้วคอมพิวเตอร์ 'หยุดทำงาน' สองครั้ง ฉันได้เรียนรู้จากประสบการณ์แล้วไม่ควรใช้คำอธิบายนี้มากเกินไปเพราะโดยปกติแล้วจะหมายความว่ามีคนที่เกี่ยวข้องกับคอมพิวเตอร์ไม่ทำงานตามที่คาดไว้ พวกเขาไม่สามารถให้รายละเอียดเพิ่มเติมกับฉันได้และฉันไม่พบข้อผิดพลาดใด ๆ ที่บันทึกไว้ ดังนั้นจึงอาจเป็นข้อผิดพลาดนี้หรือไม่ก็ได้

จาก stack-trace ข้อผิดพลาดที่เกิดขึ้นจริงคือเมื่อสร้างคลาสซึ่งไม่ได้เรียกรหัสการทำงานร่วมกันโดยตรง แต่อาจมีความซับซ้อนเนื่องจากวัตถุอาจเป็นส่วนหนึ่งของรายการที่เป็นฐานข้อมูลไปยัง DevExpress Grid

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

คอมพิวเตอร์ที่เป็นปัญหาดูเหมือนจะไม่ได้รับการเน้นย้ำ ใช้งาน Vista Business มีหน่วยความจำ 2GB และตามที่ Task Manager ใช้เพียงครึ่งเดียวกับแอปพลิเคชันของเราเพียงประมาณ 200Mb

มีข้อมูลอีกชิ้นหนึ่งที่อาจเกี่ยวข้องหรือไม่เกี่ยวข้อง ส่วนอื่นของโปรแกรมเดียวกันใช้องค์ประกอบของบุคคลที่สามซึ่งเป็น dotnet wrapper ที่มีประสิทธิภาพรอบ ๆ dll ดั้งเดิมและส่วนประกอบนี้มีปัญหาที่ทราบซึ่งในบางครั้งคุณจะได้รับ

พยายามอ่านหรือเขียนหน่วยความจำที่มีการป้องกัน ซึ่งมักจะเป็นข้อบ่งชี้ว่าหน่วยความจำอื่นเสียหาย

ผู้ผลิตส่วนประกอบกล่าวว่าสิ่งนี้ได้รับการแก้ไขแล้วในเวอร์ชันล่าสุดของส่วนประกอบที่เราใช้อยู่ภายใน แต่ยังไม่ได้มอบให้กับลูกค้า

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

แต่มีอะไรเพิ่มเติมที่ฉันสามารถทำได้?

คำตอบ:


28

ใช่. ข้อผิดพลาดนี้เป็นข้อยกเว้นเชิงโครงสร้างที่ไม่ได้แมปกับข้อผิดพลาด. NET อาจเป็นไปได้ว่าการทำแผนที่ DataGrid ของคุณทำให้เกิดข้อยกเว้นดั้งเดิมที่ไม่ถูกตรวจพบ

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


1
StackTrace ไม่ได้พูดถึง DevExpress ที่ไหนเลย แต่เป็นแค่ชั้นเรียนของฉัน จะต้องตรวจสอบดูว่า ErrorCode คืออะไร
sgmoore

ในกรณีนั้นให้ลองคิดว่าอะไรทำให้เกิดข้อความแสดงข้อผิดพลาด
Reed Copsey

4
"โดยดูที่คุณสมบัติ ExternalException.ErrorCode" - คุณมีคำแนะนำว่าจะทำอย่างไร? VS แสดงให้ฉันเห็น "ข้อยกเว้นที่ไม่สามารถจัดการได้ของประเภท 'System.Runtime.InteropServices.SEHException' เกิดขึ้นใน .... dll ข้อมูลเพิ่มเติม: Eine externe Komponente hat eine Ausnahme ausgelöst" แต่นอกเหนือจากในแอปพลิเคชัน C # ไม่มีลิงก์ เพื่อดู "รายละเอียด" ของออบเจ็กต์ข้อยกเว้นที่ใดก็ได้
หรือผู้ทำแผนที่

ดีบักเกอร์ของ VSCode แสดงอินสแตนซ์ $ ข้อยกเว้นภายใต้ Locals ซึ่งรวมถึงฟิลด์ข้อความซึ่งรวมถึงรหัสและข้อความแสดงข้อผิดพลาดที่มนุษย์อ่านได้
nightblade 9

8

ฉันมีปัญหาคล้ายกันกับ SEHException ที่เกิดขึ้นเมื่อโปรแกรมของฉันใช้กระดาษห่อ dll ดั้งเดิมเป็นครั้งแรก ปรากฎว่า DLL ดั้งเดิมสำหรับ Wrapper นั้นหายไป ข้อยกเว้นนี้ไม่มีประโยชน์ในการแก้ปัญหานี้ สิ่งที่ช่วยได้ในตอนท้ายคือการเรียกใช้ procmon ในพื้นหลังและตรวจสอบว่ามีข้อผิดพลาดใด ๆ เมื่อโหลด DLL ที่จำเป็นทั้งหมดหรือไม่


5

หากคุณกำลังมีปัญหาตามที่อธิบายไว้ในโพสต์นี้:

asp.net mvc debugger ขว้าง SEHException

จากนั้นวิธีแก้ปัญหาคือ:

หากคุณมีแอปพลิเคชันใด ๆ จาก Trusteer (เช่นสายสัมพันธ์หรืออะไรก็ได้) เพียงแค่ถอนการติดตั้งและรีบูตระบบของคุณมันจะทำงานได้ดี ... พบวิธีแก้ปัญหานี้ที่นี่:

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


3

ผู้ผลิตส่วนประกอบกล่าวว่าสิ่งนี้ได้รับการแก้ไขแล้วในเวอร์ชันล่าสุดของส่วนประกอบที่เราใช้อยู่ภายใน แต่สิ่งนี้ได้มอบให้กับลูกค้า

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


1

ฉันพบข้อผิดพลาดนี้เมื่อแอปอยู่ในการแชร์เครือข่ายและอุปกรณ์ (แล็ปท็อปแท็บเล็ต ... ) ถูกตัดการเชื่อมต่อจากเครือข่ายในขณะที่แอปกำลังใช้งานอยู่ ในกรณีของฉันเป็นเพราะแท็บเล็ต Surface ออกนอกช่วงสัญญาณไร้สาย ไม่มีปัญหาหลังจากติดตั้ง WAP ที่ดีขึ้น


1
ฉันได้รับมันแบบสุ่มในขณะที่เข้าถึงการสะท้อนแบบต่างๆ (GetAssemblyName, GetProperty, Activator ฯลฯ ) ทั้งในโค้ดของฉันและไลบรารีของบุคคลที่สามและในสภาพแวดล้อมของลูกค้าเพียงรายเดียวเช่นเดียวกับไลบรารีบนพื้นที่ห่างไกล มีหลักฐานมากมายว่าเป็นบั๊ก. net framework
Andriy K

Andriy K: ฉันไม่คิดว่านี่เป็นปัญหา. NET ฉันคิดว่าการจัดการกับไฟล์ที่เปิดบนการแชร์เครือข่ายจะหายไป \ หลุดอย่างใดอาจเป็นข้อผิดพลาดใน Windows หรือปัญหาเครือข่าย แอสเซมบลีเป็นหน่วยความจำที่แมปและจะถูกเพจเข้าจากดิสก์ออนดีมานด์ (ระเบิดเวลา) ซึ่งอาจทำให้หน่วยความจำถูกทิ้งในสถานการณ์หน่วยความจำเหลือน้อยเช่นกัน หากที่จับไฟล์ที่เปิดไม่มั่นคงอาจทำให้เกิดควันขึ้น .NET อาจจัดการและเปิดไฟล์ขึ้นมาใหม่ได้ (ราบรื่นกว่าปัญหา) แต่อาจมีความซับซ้อน
osexpert

ผมมีปัญหาเดียวกัน. ฉันได้รับ System.Runtime.InteropServices.SEHException (0x80004005) โดยไม่มีการติดตามสแต็ก นี่คือ InnerException ของ TargetInvocationException TargetInvocationException มีการติดตามสแต็ก แต่มันไม่สมเหตุสมผลสำหรับฉันเพราะดูเหมือนว่าจะมาจาก main หรือ Application.Run มันเกิดขึ้นแบบสุ่มส่วนใหญ่ในตอนเย็น \ คืน ฉันเดาว่า "วิธีแก้ปัญหา" เพียงอย่างเดียวคือไม่เรียกใช้จากไดรฟ์เครือข่าย: - | บางทีฉันอาจเพิ่มการตรวจสอบที่สามารถบล็อกสถานการณ์นี้ได้: stackoverflow.com/questions/8633680/…
osexpert

0

ข้อมูลอื่น ... วันนี้มีปัญหาในระบบ Windows 2012 R2 x64 TS ที่แอปพลิเคชันเริ่มต้นจากเส้นทาง UN / เครือข่าย ปัญหาเกิดขึ้นกับแอปพลิเคชันเดียวสำหรับผู้ใช้เทอร์มินัลเซิร์ฟเวอร์ทั้งหมด การเรียกใช้แอปพลิเคชันภายในเครื่องทำงานได้โดยไม่มีปัญหา หลังจากรีบูตเครื่องจะเริ่มทำงานอีกครั้ง - การโยนของ SEHException ได้รับ Constructor init และ TargetInvocationException


0

การกำหนดค่าเครื่องของฉัน:

ระบบปฏิบัติการ: Windows 10 เวอร์ชัน 1703 (x64)

ฉันพบข้อผิดพลาดนี้ขณะทำการดีบักโปรเจ็กต์ C # .Net ของฉันใน Visual Studio 2017 Community edition ฉันเรียกเมธอดดั้งเดิมโดยดำเนินการ p / เรียกใช้แอสเซมบลี C ++ ที่โหลดในขณะรัน ฉันพบข้อผิดพลาดเดียวกันกับที่ OP รายงาน

ฉันรู้ว่า Visual Studio เปิดตัวด้วยบัญชีผู้ใช้ซึ่งไม่ใช่ผู้ดูแลระบบในเครื่อง จากนั้นฉันจึงเปิดใช้ Visual Studio อีกครั้งภายใต้บัญชีผู้ใช้อื่นซึ่งเป็นผู้ดูแลระบบในเครื่อง นั่นคือทั้งหมด ปัญหาของฉันได้รับการแก้ไขแล้วและฉันไม่ประสบปัญหาอีก

สิ่งหนึ่งที่ควรทราบคือวิธีการที่ถูกเรียกใช้ในแอสเซมบลี C ++ นั้นควรจะเขียนบางสิ่งในรีจิสทรี ฉันไม่ได้ไปดีบักโค้ด C ++ เพื่อทำ RCA แต่ฉันเห็นความเป็นไปได้ว่าสิ่งทั้งหมดล้มเหลวเนื่องจากสิทธิ์ระดับผู้ดูแลระบบจำเป็นต้องเขียนรีจิสตรีในระบบปฏิบัติการ Windows 10 ก่อนหน้านี้เมื่อ Visual Studio ทำงานภายใต้บัญชีผู้ใช้ที่ไม่มีสิทธิ์ระดับผู้ดูแลบนเครื่องการโทรแบบเนทีฟจึงล้มเหลว


0

ฉันได้รับข้อผิดพลาดนี้ขณะเรียกใช้การทดสอบหน่วยในการแคชในหน่วยความจำที่ฉันกำลังตั้งค่า มันท่วมแคช หลังจากทำให้แคชเป็นโมฆะและรีสตาร์ท VM ก็ทำงานได้ดี

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