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


144

ฉันหวังว่าบางคนสามารถให้ความรู้แก่ฉันเกี่ยวกับสิ่งที่อาจทำให้เกิดข้อผิดพลาดนี้:

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

ฉันไม่สามารถโพสต์รหัสได้เพราะข้อผิดพลาดนี้ดูเหมือนจะถูกโยนทิ้งในพื้นที่สุ่ม ๆ ของแอปพลิเคชัน แอปพลิเคชันจะทำงานที่ใดก็ได้จาก 12-48 ชั่วโมงก่อนที่จะเกิดข้อผิดพลาด บางครั้งมันจะหยุดในจุดสุ่มที่ดูเหมือนและโยนข้อผิดพลาดด้านบนครั้งอื่น ๆ ที่แอปพลิเคชันทั้งหมดหยุดและฉันได้รับหน้าจอที่มีข้อผิดพลาดที่บอกบางอย่างตามแนวของ "มีข้อผิดพลาดร้ายแรงใน ... บั๊กใน CLR หรือ ... "บางอย่างเกี่ยวกับ PInvoke หรือข้อมูลอื่น ๆ ที่ไม่เกี่ยวข้อง เมื่อสิ่งนี้เกิดขึ้นเธรดทั้งหมดจะถูกยกเลิกและไม่มีข้อมูลการดีบัก

สรุปนี่คือสิ่งที่แอปพลิเคชันทำ:

มันเป็นแอพพลิเคชันเซิร์ฟเวอร์แบบมัลติเธรดที่เขียนด้วยภาษา C # ทั้งหมด ลูกค้าเชื่อมต่อกับเซิร์ฟเวอร์ผ่านซ็อกเก็ต เซิร์ฟเวอร์จะใช้ "สภาพแวดล้อม" เสมือนจริงสำหรับลูกค้าที่พวกเขาสามารถโต้ตอบกันและสิ่งแวดล้อม ใช้หน่วยความจำไม่มาก แต่ฉันไม่เห็นว่ามันรั่ว โดยทั่วไปแล้วจะใช้ประมาณ 1.5GB ฉันไม่คิดว่ามันจะรั่วเพราะการใช้หน่วยความจำค่อนข้างคงที่ตลอดเวลาที่แอปพลิเคชันทำงานอยู่ มันใช้รหัสอย่างต่อเนื่องเพื่อรักษาสภาพแวดล้อมแม้ว่าลูกค้าจะไม่ทำอะไรเลย มันไม่ใช้ซอฟต์แวร์บุคคลที่สามหรือ API อื่น ๆ ทรัพยากรภายนอกเท่านั้นที่แอปพลิเคชันนี้ใช้คือการเชื่อมต่อซ็อกเก็ตและการเชื่อมต่อฐานข้อมูล SQL มันทำงานบนเซิร์ฟเวอร์ 64 บิต ฉันได้ลองแก้ไขข้อบกพร่องนี้ใน VS2008 & VS2010 โดยใช้. net 2.0, 3.5 และ 4

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


กรุณาโพสต์กองซ้อนเรียกเต็ม ...
มิทช์ข้าวสาลี


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

ตรวจสอบคอมโพเนนต์ COM และ ActiveX ที่เส็งเคร็งเก่า ๆ ฉันยังรู้ว่า craps SQLCE ลึกหนาบางเช่นนี้ในสภาพแวดล้อมแบบมัลติเธรด
leppie

ไม่มีส่วนประกอบ COM หรือ ActiveX
คนอื่น

คำตอบ:


50

ฉันเพิ่งประสบปัญหานี้ใน VS 2013 .NET 4.5 พร้อม MapInfo DLL ปรากฎว่าปัญหาคือฉันเปลี่ยนแพลตฟอร์มสำหรับ Build จาก x86 เป็น CPU ใด ๆ และนั่นก็เพียงพอแล้วที่จะทำให้เกิดข้อผิดพลาดนี้ การเปลี่ยนกลับไปเป็น x86 นั้นได้ทำการหลอกลวง อาจช่วยใครซักคน


1
คุณเปลี่ยนมันกลับด้วย x86 ได้อย่างไร ฉันแค่ facinf ปัญหาเดียวกันกับคำแนะนำCSingleLock lock(&m_csMember, TRUE);นี้ สำหรับรายละเอียดเพิ่มเติมนี่คือโพสต์ของฉัน
ABCmo

ใน VS 2012/2013 ไปที่คุณสมบัติโครงการ -> สร้างและเปลี่ยน "เป้าหมายแพลตฟอร์ม" เป็นสิ่งที่คุณต้องการ แม้ว่าฉันคิดว่ามีสถานที่อื่นที่คุณสามารถเปลี่ยนแปลงได้ แต่ฉันไม่สามารถหามันได้ฉันคิดว่าวิธีใดวิธีหนึ่งควรบรรลุผลลัพธ์เดียวกัน
Sergey

จริง ๆ แล้วฉันใช้ VS 2013 และมีการกำหนดค่าเป็น x86: /
ABCmo

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

การแก้ปัญหาร่วมกับคำตอบนี้แก้ปัญหาให้ฉันแล้ว
Zach Posten

23

ฉันยังประสบปัญหานี้กับ Visual Studio (VS) 2010 น่าสนใจยิ่งขึ้นฉันมีหลายโครงการในโซลูชันของฉัน (แอปพลิเคชันคอนโซล, แอปพลิเคชัน WPF, แอปพลิเคชัน Windows Forms) แต่มันล้มเหลวเมื่อฉันตั้งค่าประเภท ของโครงการเป็นโครงการเริ่มต้นของการแก้ปัญหา (แม้สำหรับผู้ที่ไม่มีรหัสอย่างแท้จริงหรือประกอบเพิ่มเติมเรียกว่านอกเหนือจากคนเริ่มต้นที่มาพร้อมกับแม่แบบโครงการเอง)

ในที่สุดการเปลี่ยนแปลงต่อไปนี้ช่วยฉันจัดการปัญหา: ไปที่คุณสมบัติโครงการของโครงการแอปพลิเคชันคอนโซล (หรือเลือกไฟล์โครงการในโซลูชัน explorer และกดAlt+ Enterแป้นผสม) -> ไปที่Debugแท็บ -> เลื่อนไปที่Enable Debuggersส่วนในบานหน้าต่างด้านขวา -> ตรวจสอบEnable unmanaged code debuggingกล่องกาเครื่องหมายที่แสดงในภาพรวมดังต่อไปนี้ -> คลิกที่Floppyปุ่มในแถบเครื่องมือเพื่อบันทึกคุณสมบัติของโครงการ สาเหตุที่แท้จริงของสาเหตุที่เกิดขึ้นยังไม่เป็นที่ทราบแน่ชัด สิ่งเดียวที่ฉันสังเกตคือมีการอัปเดต windows จำนวนมากซึ่งติดตั้งบนเครื่องของฉันเมื่อคืนก่อนซึ่งส่วนใหญ่ประกอบด้วยการอัปเดตสำนักงานและอัปเดตระบบปฏิบัติการ (มากกว่าหนึ่งโหลบทความ KB)

ป้อนคำอธิบายรูปภาพที่นี่

อัปเดต : VS 2017 เป็นต้นไปชื่อการตั้งค่ามีการเปลี่ยนแปลงดังที่แสดงในภาพหน้าจอด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่


1
ในฐานะของ VS 2017 สิ่งนี้ถูกเปลี่ยนชื่อเป็น " เปิดใช้งานการดีบักรหัสเนทีฟ "
Chiramisu

1
ขอบคุณ @Chiramisu ที่ให้ข้อมูลที่ทันสมัยและช่วยเหลือชุมชน ฉันได้อัปเดตคำตอบเพื่อให้เหมาะกับ Visual Studio รุ่นที่ใหม่กว่า
RBT

19

ในที่สุดติดตามสิ่งนี้ด้วยความช่วยเหลือของ WinDBG และ SOS มีการโยนการละเมิดการเข้าถึงโดย DLL ที่ไม่รู้จัก ปรากฎซอฟต์แวร์ที่เรียกว่า "Nvidia Network Manager" ทำให้เกิดปัญหา ฉันได้อ่านครั้งนับไม่ถ้วนว่าปัญหานี้อาจเกิดจากไฟร์วอลล์หรือแอนติไวรัสหรือไม่ซึ่งฉันไม่ได้ใช้งานดังนั้นฉันจึงเลิกแนวคิดนี้ นอกจากนี้ฉันยังอยู่ภายใต้สมมติฐานว่ามันไม่ได้เป็นสิ่งแวดล้อมเพราะมันเกิดขึ้นบนเซิร์ฟเวอร์มากกว่า 1 เครื่องโดยใช้ฮาร์ดแวร์ที่แตกต่าง ปรากฎว่าเครื่องทั้งหมดที่ฉันทดสอบนี้กำลังใช้งาน "NVidia Network Manager" ฉันเชื่อว่ามันติดตั้งกับไดรเวอร์เมนบอร์ดที่เหลือ

หวังว่านี่จะช่วยคนได้เนื่องจากปัญหานี้ทำให้แอปพลิเคชันของฉันเป็นเวลานานมาก


1
ในกรณีของฉันเมื่อฉันอ่านข้อมูลจากอุปกรณ์บ่อยครั้งที่เกิดข้อผิดพลาดในการขว้างมันฉันหยุดเธรดบางครั้งโดยใช้ Thread.Sleep (1000) สำหรับการอ่านครั้งถัดไป และการทำงานที่สมบูรณ์แบบ
JRB

6
ฉันจะสันนิษฐานว่าการรักษาคือ "ถอนการติดตั้ง NVidia Network Manager"
paulm

79
ส่วนใหญ่โหวตคำตอบซึ่งไม่ได้ให้คำตอบที่เป็นตรรกะใด ๆ
Teoman shipahi

ฉันสงสัยว่าฉันมีอะไรเกี่ยวข้องกับ nvidia ในเมนบอร์ดหรือซอฟต์แวร์ของฉัน ฉันใช้ Visual Studio 2010 ปัญหานี้เกิดขึ้นเฉพาะในระหว่างการดีบักโครงการจาก VS exe เอาต์พุตจากโฟลเดอร์ debug ทำงานได้สมบูรณ์แบบ
RBT

1
ฉันเข้าสู่กระบวนการของตัวเองซึ่งเป็นสาเหตุของปัญหา
Muhammad Saqib

13

ปัญหาอาจเกิดจากการผสมสร้างแพลตฟอร์ม DLLs ในโครงการ เช่นคุณสร้างโครงการของคุณให้กับ CPU ใด ๆ แต่มี DLLs บางตัวในโครงการที่สร้างขึ้นแล้วสำหรับแพลตฟอร์ม x86 สิ่งเหล่านี้จะทำให้เกิดการขัดข้องแบบสุ่มเนื่องจากการแมปหน่วยความจำที่แตกต่างกันของสถาปัตยกรรม 32 บิตและ 64 บิต หาก DLLs ทั้งหมดถูกสร้างขึ้นสำหรับแพลตฟอร์มเดียวปัญหาสามารถแก้ไขได้



8

ข้อผิดพลาดนี้ไม่ควรเกิดขึ้นในรหัสที่ได้รับการจัดการ นี่อาจช่วยแก้ปัญหา:

ไปที่ดีบักเกอร์ Visual Studio เพื่อข้ามข้อยกเว้นนี้:

Tools menu ->Options -> Debugging -> General -> Uncheck this option "Suppress JIT optimization on module load"

หวังว่ามันจะช่วย


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

6

ฉันพบเจอและมีการแก้ไขข้อยกเว้นนี้ในวันนี้ มันเกิดขึ้นเมื่อฉันพยายามดีบักการทดสอบหน่วย (NUnit) ที่เรียกว่าวิธีเสมือนในคลาสนามธรรม

ปัญหานี้ปรากฏขึ้นพร้อมกับการติดตั้ง. NET 4.5.1

ฉันดาวน์โหลด. NET 4.5.2 และติดตั้งแล้ว (โครงการของฉันยังอ้างอิง. NET 4.5.1) และปัญหาได้รับการแก้ไขแล้ว

แหล่งที่มาของการแก้ปัญหา:

https://connect.microsoft.com/VisualStudio/feedback/details/819552/visual-studio-debugger-throws-accessviolationexception


5

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

คุณใช้ระบบปฏิบัติการและเซอร์วิสแพ็คใด


1
ใช้ XP 64 SP2 สิ่งนี้เกิดขึ้นในหลาย ๆ เซิร์ฟเวอร์ ฉันผ่านทุกสิ่งมาหลายครั้งแล้วและฉันไม่เห็นสิ่งใดที่ไม่ปลอดภัย นอกจากนี้ฉันจะไม่ได้รับการแก้ไขข้อผิดพลาดของคอลเลกชันแทนที่จะเป็นช่องโหว่การเข้าถึงหรือไม่?
คนอื่น

5

ฉันมีปัญหานี้เมื่อเร็ว ๆ นี้เมื่อฉันเปลี่ยนเซิร์ฟเวอร์การพัฒนาสำหรับโครงการ ฉันได้รับข้อผิดพลาดนี้ในบรรทัดของรหัสที่ฉันประกาศตัวแปร OracleConnection ใหม่

หลังจากลองหลายสิ่งรวมถึงการติดตั้งโปรแกรมแก้ไขด่วนฉันพยายามเปลี่ยนการอ้างอิง Oracle.DataAccess และ System.Data.OracleClient ในโครงการและใช้งานได้!

เมื่อโครงการถูกย้ายไปยังเครื่องใหม่ฉันขอแนะนำให้คุณต่ออายุการอ้างอิงทั้งหมดที่เพิ่มในโครงการนั้น


4

คุณลองปิดDEP (Data Execution Prevention)สำหรับแอปพลิเคชันของคุณหรือไม่


2
ฉันไม่แน่ใจว่าเป็นความคิดที่ดี มันอาจชะลอการชนได้ แต่ก็ต้องเสียค่าใช้จ่ายในการทำความเสียหายเพิ่มขึ้น ฉันคิดว่าความคิดที่ดีที่สุดหากคุณกำลังจะพังคือการพังเร็ว :-)
paxdiablo

1
การปิด DEP นั้นไม่ฉลาด แต่เป็นการวินิจฉัยที่มีประโยชน์
vcsjones

4

ฉันประสบปัญหาเดียวกัน รหัสของฉันคือ. dll dll (ส่วนขยาย AutoCAD) ที่ทำงานภายใน AutoCAD 2012 ฉันยังใช้ Oracle.DataAccess และรหัสของฉันก็มีข้อยกเว้นเดียวกันระหว่าง ExecuteNonQuery () ฉันโชคดีที่แก้ไขปัญหานี้ด้วยการเปลี่ยนรุ่น. net ของ ODP ที่ฉันใช้ (นั่นคือ 2.x ของ Oracle.DataAccess)


ฉันกำลังเผชิญปัญหาเดียวกัน - autocad .net dll - คุณสามารถอธิบายรายละเอียดเกี่ยวกับปัญหาและการแก้ไขได้อย่างไร
BKSpurgeon

3

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

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

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

  • ตัวชี้เริ่มต้นหรือค่าอื่น ๆ
  • เขียนมากขึ้นในบัฟเฟอร์กว่าขนาดของมัน
  • ทรัพยากรที่แบ่งใช้โดยเธรดที่ไม่ได้รับการป้องกันโดย mutexes

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

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

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


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

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

5
@Someone อื่น: ฉันแทบจะไม่คิดว่าการโทรชื่อจะช่วยให้คุณได้รับความช่วยเหลือมากมาย
มิทช์ข้าวสาลี

2
@Someone อื่นฉันได้ช่วยให้มากที่สุดเท่าที่ฉันสามารถให้ข้อมูลที่ จำกัด ที่คุณให้ แม้แต่แพทย์ที่ดีที่สุดในโลกก็ไม่สามารถทำอะไรได้มากมายกับผู้ป่วยเพียงแค่ระบุว่า "ฉันเจ็บ" :-) หากคุณต้องการให้ข้อมูลที่เฉพาะเจาะจงมากขึ้นบางทีเราอาจช่วยคุณได้มากกว่านี้
paxdiablo

5
คำตอบที่ไม่ถูกต้อง แต่เข้าใกล้การคาดเดาที่ไร้ยางอายสมมติฐานที่ไม่ยุติธรรมไม่มีวิธีแก้ปัญหา ... ทำไมคำตอบนี้ถึงยังอยู่? และคน 3 คนที่เป็นไปได้ที่จะตอบคำถามนี้ได้อย่างไร
ThunderGr

3

รหัสที่ตรวจสอบได้ไม่สามารถทำให้หน่วยความจำเสียหายได้ดังนั้นจึงมีสิ่งที่ไม่ปลอดภัยเกิดขึ้น คุณใช้รหัสที่ไม่ปลอดภัยใด ๆ เช่นในการประมวลผลบัฟเฟอร์? นอกจากนี้เนื้อหาเกี่ยวกับ PInvoke อาจไม่เกี่ยวข้องเนื่องจาก PInvoke เกี่ยวข้องกับการเปลี่ยนรหัสที่ไม่มีการจัดการและการจัดการที่เกี่ยวข้อง

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


มันระบุว่า PInvoke เป็นสาเหตุที่เป็นไปได้ในข้อความแสดงข้อผิดพลาด ไม่มีรหัสที่ไม่ปลอดภัย ฉันจะลอง WinDBG ขอบคุณ
คนอื่น

3

ตกลงนี่อาจจะไร้ประโยชน์และน่าสนใจเพียง แต่ ...

ข้อยกเว้นนี้ถูกโยนอย่างต่อเนื่องโดยห้องสมุด Twain32 ที่เราใช้ในโครงการของฉัน แต่จะเกิดขึ้นในเครื่องของฉันเท่านั้น

ฉันลองใช้วิธีแก้ปัญหาที่แนะนำทั่วอินเทอร์เน็ตเพื่อไม่เกิดประโยชน์ ... จนกว่าฉันจะถอดปลั๊กโทรศัพท์มือถือของฉัน (มันเชื่อมต่อผ่าน USB)

และมันก็ใช้งานได้

ปรากฎว่าห้องสมุด Twain32 พยายามที่จะแสดงรายการโทรศัพท์ของฉันเป็นอุปกรณ์ที่รองรับ Twain และสิ่งที่ทำในกระบวนการนั้นทำให้เกิดข้อยกเว้นนั้น

ไปคิด ...


3

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

แทน

StringBuilder windowText = new StringBuilder(); // Probable overflow of default capacity (16)

ใช้ความจุที่มากขึ้น:

StringBuilder windowText = new StringBuilder(3000);

2

ในกรณีของฉันไฟล์ถูกเปิดและล็อคดังนั้น

ฉันได้รับเมื่อพยายามโหลดไฟล์ Excel โดยใช้ LinqToExcel ที่เปิดใน Excel ด้วย

ทั้งหมดนี้คือสิ่งที่ฉันทำไว้

    var maps = from f in book.Worksheet<NavMapping>()
                select f;
    try {
        foreach (var m in maps)
            if (!string.IsNullOrEmpty(m.SSS_ID) && _mappings.ContainsKey(m.SSS_ID))
                _mappings.Add(m.SSS_ID, m.CDS_ID);
    } catch (AccessViolationException ex) {
        _logger.Error("mapping file error. most likely this file is locked or open. " + ex);
    }

2

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


1

ฉันมีปัญหานี้เช่นกัน ฉันใช้โซลูชันที่แตกต่างกันในเวลาเดียวกันโดยใช้ visual studio เมื่อปิดโซลูชันอื่น ๆ และทำงานเฉพาะโซลูชันเป้าหมายทำงานได้ดีโดยไม่มีข้อผิดพลาดนั้น


1

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


1
นั่นคือสถานการณ์ของฉันกับ VS 2017 - System.AccessViolationException: พยายามอ่านหรือเขียนหน่วยความจำที่ได้รับการป้องกัน นี่เป็นข้อบ่งชี้ว่าหน่วยความจำอื่นเสียหาย ฉันเพิ่งรีสตาร์ท PC เพื่อแก้ปัญหานี้โดยไม่ทำอะไรเลย
ฮ่องกง

0

คำตอบของฉันขึ้นอยู่กับสถานการณ์ของคุณ แต่เรามีปัญหาในการอัพเกรดแอปพลิเคชั่น. NET สำหรับลูกค้าที่อายุ> 10 ปีขึ้นไปดังนั้นพวกเขาจึงสามารถใช้งานได้กับ Windows 8.1 @ คำตอบของ alhazen เป็นชนิดของ ballpark ที่ถูกต้องสำหรับฉัน แอปพลิเคชันนั้นใช้ DLL บุคคลที่สามซึ่งลูกค้าไม่ต้องการจ่ายเพื่ออัปเดต (Pegasus / Accusoft ImagXpress) เรากำหนดเป้าหมายแอปพลิเคชันสำหรับ NET 4.5 อีกครั้ง แต่ทุกครั้งที่บรรทัดต่อไปนี้ทำงานเราได้รับAccessViolationException was unhandledข้อความ:

UnlockPICImagXpress.PS_Unlock (1908228217,373714400,1341834561,28447);

ในการแก้ไขเราต้องเพิ่มเหตุการณ์ post-build ต่อไปนี้ในโครงการ:

call "$(DevEnvDir)..\tools\vsvars32.bat"
"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\amd64\editbin.exe" /NXCOMPAT:NO "$(TargetPath)"

สิ่งนี้ระบุการปฏิบัติการที่ไม่สอดคล้องกับ Data Execution Prevention อย่างชัดเจน ดูรายละเอียดเพิ่มเติมที่นี่


0

ในบางกรณีสิ่งนี้อาจเกิดขึ้นเมื่อ:

obj = new obj();
...
obj.Dispose();  // <-----------------    Incorrect disposal causes it
obj.abc...

0

ในกรณีของฉันฉันต้องอ้างอิงไลบรารี C / C ++ โดยใช้ P / Invoke แต่ฉันต้องแน่ใจว่าหน่วยความจำถูกจัดสรรสำหรับอาร์เรย์เอาต์พุตก่อนโดยใช้fixed:

[DllImport("my_c_func_lib.dll", CharSet = CharSet.Ansi)]
public static extern unsafe int my_c_func(double input1, double input2, double pinput3, double *outData);

    public unsafe double[] GetMyUnmanagedCodeValue(double input1, double input2, double input3)
    {
        double[] outData = new double[24];

        fixed (double* returnValue = outData)
        {
            my_c_func(input1, input2, pinput3, returnValue);
        }

        return outData;
    }

สำหรับรายละเอียดโปรดดู: https://www.c-sharpcorner.com/article/pointers-in-C-Sharp/


0

สิ่งนี้เกิดขึ้นกับฉันเมื่อฉันดีบักแอปพลิเคชัน C # WinForms ใน Visual Studio แอปพลิเคชันของฉันโทรออกไปยังไฟล์ Win32 ผ่านทาง DllImport เช่น

[DllImport("Secur32.dll", SetLastError = false)]
private static extern uint LsaEnumerateLogonSessions(out UInt64 LogonSessionCount, out IntPtr LogonSessionList);

เรียกใช้ Visual Studio "ในฐานะผู้ดูแลระบบ" ช่วยแก้ปัญหาให้ฉัน


0

ฉันมีข้อผิดพลาดเดียวกัน:

System.AccessViolationException: พยายามอ่านหรือเขียนหน่วยความจำที่ได้รับการป้องกัน นี่เป็นข้อบ่งชี้ว่าหน่วยความจำอื่นเสียหาย

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


0

ในกรณีของฉันยูทิลิตี้ FTDI FT Prog ได้โยนข้อผิดพลาดตามที่สแกนหาอุปกรณ์ USB การถอดปลั๊กหูฟังบลูทู ธ ของฉันจากพีซีแก้ไขปัญหา


0

ฉันได้รับข้อความแสดงข้อผิดพลาดนี้ในนิพจน์แลมบ์ดาที่ใช้ Linq เพื่อกรองชุดของวัตถุ เมื่อฉันตรวจสอบคอลเลกชันฉันสังเกตเห็นว่าสมาชิกของมันไม่ได้บรรจุ - ในLocalsหน้าต่างขยายพวกเขาเพียงแค่แสดง "... " ในที่สุดปัญหาก็คือในวิธีการเก็บข้อมูลที่แรกเริ่มมีการเก็บรวบรวม - Dapper พยายามที่จะแมปคุณสมบัติของวัตถุที่ซ้อนกันโดยอัตโนมัติ ฉันแก้ไขเคียวรี Dapper เพื่อจัดการหลายการแม็พและแก้ไขข้อผิดพลาดของหน่วยความจำ

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