보호 된 메모리를 읽거나 쓰려고했습니다. 이것은 종종 다른 메모리가 손상되었음을 나타냅니다.


144

누군가이 오류를 일으킬 수있는 것에 대해 누군가를 깨달을 수 있기를 바랍니다.

보호 된 메모리를 읽거나 쓰려고했습니다. 이것은 종종 다른 메모리가 손상되었음을 나타냅니다.

이 오류는 응용 프로그램의 임의의 영역에서 발생하는 것으로 보이므로 실제로 코드를 게시 할 수 없습니다. 응용 프로그램은 오류가 발생하기 전에 12-48 시간 동안 실행됩니다. 때로는 겉보기에 임의의 지점에서 멈추고 위의 오류가 발생합니다. 다른 경우 전체 응용 프로그램이 중지되고 "치명적인 오류가 발생했습니다 ... '라는 줄에 오류가있는 화면이 나타납니다. CLR의 버그 또는 ... "PInvoke 또는 기타 관련이없는 정보에 관한 정보. 이 경우 모든 스레드가 종료 된 것으로 표시되고 사용 가능한 디버깅 정보가 없습니다.

간단히 말해서 이것은 응용 프로그램이하는 일입니다.

C #으로 작성된 멀티 스레드 서버 응용 프로그램입니다. 클라이언트는 소켓을 통해 서버에 연결됩니다. 서버는 클라이언트가 서로 및 환경과 상호 작용할 수있는 가상 환경을 실행합니다. 꽤 많은 메모리를 소비하지만 누수가 보이지 않습니다. 일반적으로 약 1.5GB를 소비합니다. 메모리 사용량이 응용 프로그램이 실행되는 동안 전체적으로 상대적으로 일정하기 때문에 누수가 있다고 생각하지 않습니다. 클라이언트가 아무것도하지 않더라도 환경을 유지하기 위해 지속적으로 코드를 실행합니다. 타사 소프트웨어 나 다른 API를 사용하지 않습니다. 이 응용 프로그램에서 사용하는 유일한 외부 리소스는 소켓 연결 및 SQL 데이터베이스 연결입니다. 64 비트 서버에서 실행 중입니다. VS2008 및 VS2010에서 .net 2.0, 3.5 및 4를 사용하여 디버깅하려고했습니다.

컴파일러 최적화와 여러 Microsoft 핫픽스를 끄려고했습니다. 이 문제가 사라지는 것은 없습니다. 가능한 원인 또는 문제를 일으키는 원인을 식별 할 수있는 방법을 아는 사람이 있다면 감사하겠습니다.


전체 통화 스택을 게시하십시오 ...
Mitch Wheat


통화 스택을 얻을 수없는 시간의 약 절반입니다. 치명적인 실행 오류가 발생하면 디버깅 정보가 전혀 없습니다. 실제로 코드 어딘가에서 멈추는 시간은 아무것도 이상해 보이지 않습니다. 나는 심지어 모든 활성 스레드를 겪고 충돌을 일으킬 수있는 것을 보지 못했습니다. 오류가 발생하기 전에 메모리 손상이 발생했다고 가정합니다.
누군가

오래된 오래된 COM 및 ActiveX 구성 요소가 사용되고 있는지 확인하십시오. 또한 다중 스레드 환경에서 SQLCE가 이와 같은 문제를 해결한다는 것을 알고 있습니다.
leppie

COM 또는 ActiveX 구성 요소가 없습니다.
누군가

답변:


50

VS 2013 .NET 4.5에서 MapInfo DLL을 사용 하여이 문제에 직면했습니다. 문제는 내가 빌드 플랫폼을 x86에서 모든 CPU로 변경 했으며이 오류를 발생시키기에 충분하다는 것이 문제였습니다. 다시 x86으로 변경하면 트릭이되었습니다. 누군가를 도울 수 있습니다.


1
x86으로 어떻게 바 꾸었습니까? 나는 단지이 지시에서 같은 문제를 잘 알고있다 CSingleLock lock(&m_csMember, TRUE);. 자세한 내용은 다음과 같습니다.
ABCmo

VS 2012/2013에서 Project Properties-> Build로 이동하여 "Platform Target"을 원하는 것으로 변경하십시오. 나는 이것을 바꿀 수있는 또 다른 장소가 있다고 생각하지만 그것을 찾을 수없는 것처럼 보이지만 두 가지 방법 모두 동일한 결과를 달성 해야 한다고 생각합니다 .
Sergey

실제로 VS 2013을 사용하고 있으며 x86 : /
ABCmo

1
많은 문제로 인해 문제가 발생할 수 있습니다. 빌드 플랫폼을 변경하여 문제를 해결 한 것이 정말 놀랐습니다. 당신은 운이 좋은 탈출을 말할 수 있습니다.
Sergey

답변함께이 솔루션은 나를 위해 해결했습니다.
Zach Posten

23

또한 Visual Studio (VS) 2010에서이 문제에 직면했습니다. 더 흥미롭게도 솔루션 (콘솔 응용 프로그램, WPF 응용 프로그램, Windows Forms 응용 프로그램)에 여러 프로젝트가 있었지만 "콘솔 응용 프로그램"유형을 설정하는 경우에만 실패했습니다. 솔루션의 시작 프로젝트로 프로젝트의 프로젝트 (문자 그대로 코드가 없거나 프로젝트 템플릿 자체와 함께 제공되는 기본 어셈블리와 별도로 참조되는 추가 어셈블리의 경우).

콘솔 응용 프로그램 프로젝트의 프로젝트 속성으로 이동 (또는 솔루션 탐색기에서 프로젝트 파일을 선택하고 Alt+ Enter키 조합을 누름 )-> Debug탭으로 이동 -> Enable Debuggers오른쪽 창에서 섹션으로 이동 -> 확인 Enable unmanaged code debugging아래의 스냅 샷과 같이 체크 박스 -> 클릭하여 Floppy프로젝트 속성을 저장하려면 도구 모음에서 버튼을 누릅니다. 왜 그런 일이 있었는지 근본 원인은 아직 알려지지 않았습니다. 내가 관찰 한 유일한 것은 전날 밤 내 컴퓨터에 많은 Windows 업데이트가 설치되어 사무실 업데이트와 OS 업데이트로 구성되었다는 것입니다 (12KB 이상의 기사).

여기에 이미지 설명을 입력하십시오

업데이트 : VS 2017 이후 설정 이름이 아래 스크린 샷과 같이 변경되었습니다.

여기에 이미지 설명을 입력하십시오


1
VS 2017로이 "로 이름이 바뀌 었습니다 디버깅 네이티브 코드를 사용 "
Chiramisu

1
최신 정보를 제공하고 커뮤니티를 도와 주신 @Chiramisu에게 감사드립니다. 최신 버전의 Visual Studio에 적합하도록 답변을 업데이트했습니다.
RBT

19

마지막으로 WinDBG 및 SOS의 도움으로이를 추적했습니다. 알 수없는 DLL에 의해 액세스 위반이 발생했습니다. "Nvidia Network Manager"라는 소프트웨어가 문제를 일으키는 것으로 나타났습니다. 방화벽이나 바이러스 백신으로 인해이 문제가 발생할 수있는 방법을 셀 수없이 많이 읽었으며 어느 것도 사용하지 않으므로이 아이디어를 무시했습니다. 또한 다른 하드웨어를 사용하는 둘 이상의 서버에서 발생하기 때문에 환경이 아니라고 가정했습니다. 이 컴퓨터에서 테스트 한 모든 컴퓨터가 "NVidia Network Manager"를 실행하고있었습니다. 나는 그것이 다른 마더 보드 드라이버와 함께 설치된다고 생각합니다.

이 문제가 오랫동안 내 응용 프로그램을 괴롭 혔기 때문에 누군가에게 도움이되기를 바랍니다.


1
내 경우에는 장치에서 데이터를 자주 읽는 경우 오류가 발생합니다. 다음 읽기를 위해 Thread.Sleep (1000)을 사용하여 얼마 동안 스레드를 중지했습니다. 완벽하게 작동합니다.
JRB

6
치료법이 "
NVIdia

79
논리적 답변을 제공하지 않는 가장 많이 투표 된 답변.
Teoman shipahi

내 마더 보드 또는 소프트웨어의 엔비디아와 관련된 것이 의심됩니다. Visual Studio 2010을 사용하고 있습니다.이 문제는 VS에서 프로젝트를 디버깅하는 동안에 만 발생합니다. 디버그 폴더의 출력 exe는 완벽하게 작동합니다.
RBT

1
문제를 일으키는 자체 프로세스의 스레드에 액세스하고 있습니다.
Muhammad Saqib

13

프로젝트의 혼합 빌드 플랫폼 DLL로 인해 문제가 발생할 수 있습니다. 즉, 프로젝트를 모든 CPU에 빌드하지만 x86 플랫폼 용으로 이미 빌드 된 일부 DLL이 프로젝트에 있습니다. 32 비트 및 64 비트 아키텍처의 서로 다른 메모리 매핑으로 인해 임의 충돌이 발생합니다. 모든 DLL이 하나의 플랫폼에 구축 된 경우 문제를 해결할 수 있습니다.



8

이 오류는 관리 코드에서 발생하지 않아야합니다. 이 문제를 해결할 수 있습니다.

이 예외를 무시하려면 Visual Studio Debugger로 이동하십시오.

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

그것이 도움이되기를 바랍니다.


3
작동하지 않아 죄송합니다. 이 오류는 여러 가지 이유로 발생합니다. 내가 게시 한 솔루션이 이유가 JIT 최적화 인 경우 다른 사람의 문제를 해결할 수 있다고 생각했습니다.
curiousBoy 2016 년

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

하드웨어 일 수 있습니다. 복잡 할 수 있습니다 ...하지만 스레딩 코드가 적절한 잠금으로 사전과 같은 일부 컬렉션을 보호하지 않는 곳을 제안합니다.

어떤 OS 및 서비스 팩을 실행하고 있습니까?


1
XP 64 SP2 실행 이것은 여러 서버에서 발생했습니다. 나는 여러 번 모든 것을 겪었고 스레드 안전하지 않은 것을 보지 못했습니다. 또한 액세스 위반이 아닌 컬렉션 수정 오류가 발생하지 않습니까?
누군가

5

최근에 프로젝트의 개발 서버를 변경할 때이 문제가 발생했습니다. 새로운 OracleConnection 변수를 선언 한 코드 줄 에서이 오류가 발생했습니다.

핫픽스 설치를 포함하여 많은 작업을 시도한 후 프로젝트에서 Oracle.DataAccess 및 System.Data.OracleClient 참조를 변경하려고 시도했습니다.

프로젝트를 새 컴퓨터로 옮기면 해당 프로젝트에 추가 된 모든 참조를 갱신하는 것이 좋습니다.


4

응용 프로그램에 대해 DEP (Data Execution Prevention) 를 해제하려고 했습니까 ?


2
잘 모르겠어요 의 그 좋은 아이디어입니다. 충돌을 지연시킬 수는 있지만 더 많은 피해를 주어야합니다. 가장 좋은 생각은, 당신이 추락한다면, 일찍 충돌하는 것입니다 :-)
paxdiablo

1
DEP를 끄는 것은 현명하지 않지만 유용한 진단 연습입니다.
vcsjones 3

4

나는 같은 문제에 직면했다. 내 코드는 AutoCAD 2012 내에서 실행되는 .NET dll (AutoCAD 확장자)입니다. 또한 Oracle.DataAccess를 사용하고 있으며 ExecuteNonQuery () 중에 동일한 예외가 발생했습니다. 운 좋게도 내가 사용하고있는 ODP의 .net 버전 (즉, Oracle.DataAccess의 2.x)을 변경 하여이 문제를 해결했습니다.


autocad .net dll과 같은 문제에 직면하고 있습니다. 문제와 수정 사항에 대해 자세히 설명해 주시겠습니까?
BKSpurgeon

3

이 문제는 거의 간단합니다. 코드가 잘못되었습니다. 통계 분석으로는 도구가 거의 없습니다. 수백만 명의 사람들이 매일 Visual Studio를 사용하고 있으며 일부는 코드를 사용하고 있습니다. 어떤 코드가 더 나은 테스트를 받고 있습니까? VS에 문제가 있다면 이미 발견했을 것입니다.

진술의 의미는, 당신이 아닌 메모리에 액세스하려고 할 때, 그것은 보통 다른 곳에서 온 손상된 포인터로 수행하기 때문입니다. 그것이 표시를 나타내는 이유입니다.

메모리 손상으로 인해 오류를 포착하는 것이 오류의 근본 원인에 거의 도달하지 않습니다. 그리고 그 효과는 당신이 묘사 한 것과 똑같습니다. 다음과 같은 일반적인 범인을 살펴 봐야합니다.

  • 초기화되지 않은 포인터 또는 다른 값.
  • 크기보다 버퍼에 더 많이 쓰기.
  • 뮤텍스에 의해 보호되지 않는 스레드가 공유하는 리소스.

근본 원인을 찾기 위해 이와 같은 문제에서 거꾸로 작업하는 것은 믿을 수 없을 정도로 의 생성과 문제의 탐지 사이에 많은 일이 발생할 수 있다는 점에서 어렵습니다.

나는 대부분은 무엇을 살펴 가지고 쉽게 찾을 입니다 손상 (예를 들어, 특정 포인터를) 다음 위의 그림과 같이 일반적인 범인 확인, 그것을 손상 수도를 알기 위해 코드를 수동으로 정적 분석을한다. 그러나 이것조차도 긴 일련의 문제를 포착하지는 못합니다.

VS에 대해 잘 알고 있지는 않지만 Linux 용 valgrind와 같은 메모리 추적 도구를 사용하여 명백한 문제를 발견 할 수 있는지 확인하고 싶을 수도 있습니다.


3
불량 메모리에서 손상된 포인터를 얻을 수도 있습니다. ECC 메모리가있는 서버에서이 문제가 발생하지 않으면 장기 실행 메모리 테스트 유틸리티를 사용하여 하드웨어를 원인으로 제거하십시오.
cdonner

12
하드웨어 문제가 아니라 여러 서버에서 발생한다는 것을 알고 있습니다. 코드 캡틴에 명백한 문제가 있음을 표시해 주셔서 감사합니다. 나는 비주얼 스튜디오를 비난하지 않습니다. 언급 한 바와 같이 응용 프로그램은 임의의 시간 동안 정상적으로 실행됩니다. 재현하기 쉽지 않고 몇 주 동안 문제를 식별하려고 노력했습니다.
누군가

5
@Someone Else : 이름을 부르는 것이 많은 도움을 줄 것이라고 생각하지 않습니다.
Mitch Wheat

2
@Someone Else, 나는 당신이 제공 한 제한된 정보를 줄 수있는 한 많은 도움을주었습니다. 세계 최고의 의사조차도 단순히 "나는 상처를 입었다"고 말하는 환자로는 많은 것을 할 수 없습니다.
paxdiablo

5
나쁜 대답이지만 접근 방식, 부끄러운 추론, 정당하지 않은 가정, 해결책이 제공되지 않습니다. 그리고 어떤 사람이이 대답을지지 할 수 있었습니까?
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 에서이 오류가 임의로 발생했습니다. PC를 다시 시작하면 문제가 해결되었습니다 (필요한지 확실하지 않은 경우 사전에 다음 명령을 실행했습니다 : netsh winsock reset)


1
VS 2017의 정확한 상황입니다-System.AccessViolationException : 보호 된 메모리를 읽거나 쓰려고했습니다. 이것은 종종 다른 메모리가 손상되었음을 나타냅니다. 다른 작업을 수행하지 않고이 문제를 해결하기 위해 PC를 다시 시작했습니다.
Hong

0

내 대답은 시나리오에 달려 있지만 10 세가 넘는 클라이언트의 .NET 응용 프로그램을 Windows 8.1에서 작동시킬 수 있도록 업그레이드하는 데 문제가 있습니다. @ alhazen의 대답은 나에게 맞는 야구장에 있습니다. 응용 프로그램은 클라이언트가 업데이트를 원하지 않는 타사 DLL (Pegasus / Accusoft ImagXpress)에 의존했습니다. .NET 4.5 용 응용 프로그램의 대상을 다시 지정했지만 다음 줄이 실행될 때마다 AccessViolationException was unhandled메시지를 받았습니다 .

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

이 문제를 해결하려면 프로젝트에 다음과 같은 빌드 후 이벤트를 추가해야했습니다.

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

필자의 경우 P / Invoke를 사용하여 C / C ++ 라이브러리를 참조해야했지만 다음을 사용하여 메모리가 출력 배열에 먼저 할당되었는지 확인해야했습니다 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

이것은 Visual Studio에서 C # WinForms 응용 프로그램을 디버깅 할 때 발생했습니다. 내 응용 프로그램은 DllImport를 통해 Win32 항목을 호출합니다.

[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 장치를 스캔 할 때 오류가 발생했습니다. PC에서 Bluetooth 헤드폰을 분리하면 문제가 해결되었습니다.


0

Linq를 사용하여 객체 컬렉션을 필터링하는 람다 식 에이 오류 메시지가 나타납니다. 컬렉션을 조사했을 때 멤버가 채워지지 않았 음을 알았습니다. Locals창에서 확장하면 "..."만 표시되었습니다. 궁극적으로 문제는 처음에 컬렉션을 채운 리포지토리 메서드에있었습니다. Dapper는 중첩 된 개체의 속성을 자동으로 매핑하려고했습니다. 멀티 매핑을 처리하기 위해 Dapper 쿼리를 수정했으며 메모리 오류가 수정되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.