Tentativa de ler ou escrever na memória protegida. Isso geralmente indica que outra memória está corrompida

144

Espero que alguém possa me esclarecer sobre o que poderia estar causando esse erro:

Tentativa de ler ou escrever na memória protegida. Isso geralmente indica que outras memórias estão corrompidas.

Não consigo realmente postar código porque esse erro parece ser lançado em qualquer área aleatória do aplicativo. O aplicativo será executado de 12 a 48 horas antes de gerar o erro. Às vezes, ele pára em um local aparentemente aleatório e gera o erro acima; outras vezes, o aplicativo inteiro para e uma tela com um erro informa algo como "Ocorreu um erro fatal em ... Isso pode ser um bug no CLR ou ... "algo sobre o PInvoke ou outras informações não relevantes. Quando isso acontece, todos os threads são mostrados terminados e não há informações de depuração disponíveis.

Em poucas palavras, é isso que o aplicativo faz:

É um aplicativo de servidor multiencadeado, escrito inteiramente em C #. Os clientes se conectam ao servidor via soquete. O servidor executa um "ambiente" virtual para os clientes, onde eles podem interagir entre si e com o ambiente. Consome bastante memória, mas não vejo vazamento. Consome tipicamente cerca de 1,5 GB. Não acho que esteja vazando porque o uso da memória permanece relativamente constante o tempo todo em que o aplicativo está sendo executado. Seu código constantemente em execução para manter o ambiente, mesmo que os clientes não estejam fazendo nada. Ele não usa software de terceiros ou outras APIs. Os únicos recursos externos que este aplicativo usa são conexões de soquete e conexões de banco de dados SQL. Está rodando em um servidor de 64 bits. Tentei depurar isso no VS2008 e VS2010 usando .net 2.0, 3.5 e 4.

Tentei desativar as otimizações do compilador e várias correções da Microsoft. Parece que nada resolve esse problema. Seria apreciado se alguém conhece alguma causa possível, ou algum tipo de maneira de identificar o que está causando o problema.

Alguém
fonte
por favor poste a pilha de chamadas completa ...
Mitch Wheat
Cerca da metade do tempo não consigo obter a pilha de chamadas. Se gerar o erro fatal de execução, não há informações de depuração. As vezes em que ele realmente pára em algum lugar no código, nada parece anormal. Eu já passei por todos os tópicos ativos e não vi nada que pudesse causar um conflito. Estou assumindo que a corrupção da memória ocorreu algum tempo antes de lançar o erro.
Alguém mais
Verifique se há componentes COM e ActiveX antigos e ruins. Eu também sei que o SQLCE craps outs como este em um ambiente multithread.
precisa saber é o seguinte
Não há componentes COM ou ActiveX.
Alguém mais

Respostas:

50

Acabei de enfrentar esse problema no VS 2013 .NET 4.5 com uma DLL MapInfo. Acontece que o problema foi que mudei a Plataforma para Build de x86 para Qualquer CPU e isso foi suficiente para disparar esse erro. Mudar de volta para x86 fez o truque. Pode ajudar alguém.

Sergey
fonte
1
como você mudou de volta com o x86. Estou apenas enfrentando o mesmo problema com esta instrução CSingleLock lock(&m_csMember, TRUE);. Para mais detalhes, aqui está o meu post
ABCmo
No VS 2012/2013, acesse Propriedades do projeto-> Compilar e alterar "Destino da plataforma" para o que você precisar. Embora eu ache que há outro lugar onde você pode mudar isso, mas não consigo encontrá-lo, acho que os dois modos devem alcançar o mesmo resultado.
Sergey
Na verdade, eu estou usando o VS 2013, e ele está configurado como x86: /
ABCmo 13/14
1
Seu problema pode ser causado por muitas coisas. Fiquei realmente surpreso ao corrigir o problema alterando a plataforma de compilação. Você poderia dizer uma fuga de sorte.
Sergey
Esta solução em combinação com esta resposta resolveu para mim.
Zach Posten
23

Também enfrentei esse problema com o Visual Studio (VS) 2010. Mais interessante, eu tinha vários projetos em minha solução (aplicativo de console, aplicativo WPF, aplicativo Windows Forms), mas ele falhou apenas quando, eu estava definindo o tipo "Aplicativo de console" do projeto como projeto inicial da solução (mesmo para aqueles que literalmente não tinham código ou nenhum conjunto adicional referido além dos padrões que vêm com o próprio modelo de projeto).

A seguinte mudança finalmente me ajudou a resolver o problema: Vá para as propriedades do projeto do aplicativo de console (como alternativa, selecione o arquivo do projeto no Solution Explorer e pressione Alt+ Entercombinação de teclas) -> Vá para a Debugguia -> Role para a Enable Debuggersseção no painel direito -> Marque a Enable unmanaged code debuggingcaixa de seleção, como mostrado no instantâneo abaixo -> Clique Floppyno botão na barra de ferramentas para salvar as propriedades do projeto. A causa raiz do porquê aconteceu ainda não é conhecida por mim. A única coisa que observei foi que havia muitas atualizações do Windows instaladas na minha máquina na noite anterior, que consistiam principalmente de atualizações do escritório e atualizações do sistema operacional (mais de uma dúzia de artigos da Base de Dados de Conhecimento).

insira a descrição da imagem aqui

Atualização : no VS 2017 em diante, o nome da configuração foi alterado conforme mostrado na captura de tela abaixo:

insira a descrição da imagem aqui

RBT
fonte
1
No VS 2017, esse nome foi renomeado para " Ativar depuração de código nativo "
Chiramisu
1
Obrigado @Chiramisu por fornecer informações atualizadas e ajudar a comunidade. Atualizei a resposta para torná-lo adequado para versões mais recentes do Visual Studio.
RBT
19

Finalmente rastreou isso com a ajuda do WinDBG e SOS. A violação de acesso estava sendo lançada por alguma DLL desconhecida. Acontece que um software chamado "Nvidia Network Manager" estava causando os problemas. Eu já havia lido inúmeras vezes como esse problema pode ser causado por firewalls ou antivírus, nenhum dos quais estou usando, por isso descartei essa ideia. Além disso, eu assumi que não era ambiental porque ocorre em mais de um servidor usando hardware diferente. Acontece que todas as máquinas em que testei estavam executando o "NVidia Network Manager". Acredito que ele seja instalado com o restante dos drivers da placa-mãe.

Espero que isso ajude alguém, pois esse problema atormentou meu aplicativo por um tempo muito longo.

Alguém
fonte
1
no meu caso, quando leio frequentemente dados do dispositivo, seu erro de lançamento, parei o thread por algum tempo usando Thread.Sleep (1000) para a próxima leitura. e trabalhando perfeito.
JRB
6
Eu teria assumido a cura foi "desinstalar NVidia Network Manager"
paulm
79
A maioria das respostas votadas que não fornece nenhuma resposta lógica.
precisa saber é o seguinte
Duvido que tenha algo relacionado à nvidia na minha placa-mãe ou no meu software. Estou usando o Visual Studio 2010. O problema ocorre apenas durante a depuração do projeto do VS. Seu exe de saída da pasta debug funciona perfeitamente.
RBT
1
Estou acessando threads do meu próprio processo que causam o problema.
Muhammad Saqib
13

O problema pode estar relacionado a DLLs de plataformas de compilação mistas no projeto. Você constrói seu projeto em Qualquer CPU, mas possui algumas DLLs no projeto já criadas para a plataforma x86. Isso causará falhas aleatórias devido ao mapeamento de memória diferente da arquitetura de 32 bits e de 64 bits. Se todas as DLLs forem criadas para uma plataforma, o problema poderá ser resolvido.

Muhammad Yousaf Sulahria
fonte
8

Este erro não deve ocorrer no código gerenciado. Isso pode resolver o problema:

Vá para o Visual Studio Debugger para ignorar esta exceção:

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

Espero que ajude.

curiousBoy
fonte
3
Lamento que não funcione para você. Esse erro foi gerado por vários motivos, pensei, a solução que eu publiquei, pode resolver o problema de outra pessoa se o motivo for a otimização do JIT.
curiousBoy
6

Encontrei uma solução para esta exceção hoje. Isso estava ocorrendo quando eu estava tentando depurar um teste de unidade (NUnit) que chamava de método virtual em uma classe abstrata.

O problema parece estar na instalação do .NET 4.5.1.

Fiz o download do .NET 4.5.2 e instalei (meus projetos ainda fazem referência ao .NET 4.5.1) e o problema foi resolvido.

Fonte da solução:

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

gb2d
fonte
5

Pode ser hardware. Pode ser algo complicado ... mas gostaria de sugerir que, em algum lugar, seu código de encadeamento não esteja protegendo alguma coleção (como um dicionário) com um bloqueio apropriado.

Qual SO e service pack você está executando?

Mitch Wheat
fonte
1
Executando o XP 64 SP2. Isso aconteceu em vários servidores. Eu já passei por tudo tantas vezes e não vejo nada que não seja seguro. Também wouldnt eu estou recebendo um erro de coleção modificada em vez de um viloation acesso?
Alguém mais
5

Eu tive esse problema recentemente quando mudei o servidor de desenvolvimento para um projeto. Eu estava recebendo esse erro na linha de código em que declarei uma nova variável OracleConnection.

Depois de tentar várias coisas, incluindo a instalação de hotfixes, tentei alterar as referências Oracle.DataAccess e System.Data.OracleClient no projeto e funcionou!

Quando um projeto é movido para uma nova máquina, sugiro que você renove todas as referências adicionadas nesse projeto.

deepakg_rao
fonte
4

Você tentou desativar o DEP (Data Execution Prevention) para seu aplicativo?

Hadi
fonte
2
Não sei se é uma boa ideia. Pode atrasar o acidente, mas com o custo de causar mais danos. Eu acho que a melhor idéia, se você vai travar, é travar mais cedo :-) #
660
1
Desativar a DEP não é aconselhável, mas é um exercício de diagnóstico útil.
#
4

Eu enfrentei o mesmo problema. Meu código era uma dll do .NET (extensão AutoCAD) em execução no AutoCAD 2012. Também estou usando o Oracle.DataAccess e meu código estava lançando a mesma exceção durante ExecuteNonQuery (). Felizmente, resolvi esse problema alterando a versão .net do ODP que estava usando (ou seja, 2.x do Oracle.DataAccess)

kmxr
fonte
Estou enfrentando o mesmo problema - autocad .net dll - você pode elaborar qual era o problema e a correção?
precisa saber é o seguinte
3

Esse problema é quase sempre invariavelmente simples. O código está ruim. Raramente são as ferramentas, apenas a partir de uma análise estatística. Incontáveis ​​milhões de pessoas estão usando o Visual Studio todos os dias e talvez algumas estejam usando seu código - que parte do código está obtendo os melhores testes? Garanto que, se esse fosse um problema com o VS, provavelmente já o teríamos encontrado.

O que a declaração significa é que, quando você tenta acessar a memória que não é sua, geralmente é porque você está fazendo isso com um ponteiro corrompido, que veio de outro lugar. É por isso que está indicando a indicação.

Com a corrupção de memória, a captura do erro raramente está próxima da causa raiz do erro. E os efeitos são exatamente o que você descreve, aparentemente aleatórios. Você apenas terá que olhar para os culpados de sempre, coisas como:

  • ponteiros não inicializados ou outros valores.
  • escrevendo mais em um buffer que seu tamanho.
  • recursos compartilhados por threads que não são protegidos por mutexes.

Trabalhar de trás para frente a partir de um problema como esse para encontrar a causa raiz é incrivelmente difícil, pois muito poderia ter acontecido entre a criação do problema e a detecção do problema.

Acho que é mais fácil dar uma olhada no que é corrompido (por exemplo, um ponteiro específico) e depois fazer uma análise estática manual do código para ver o que poderia ter corrompido, verificando os culpados comuns, como mostrado acima. No entanto, mesmo isso não vai pegar longas cadeias de problemas.

Eu não estou familiarizado o suficiente com o VS para saber, mas você também pode querer examinar a possibilidade de usar uma ferramenta de rastreamento de memória (como o valgrind para Linux) para ver se ele pode detectar problemas óbvios.

paxdiablo
fonte
3
Você também pode obter um ponteiro corrompido da memória ruim. Se isso não estiver acontecendo em um servidor com memória ECC, tente um utilitário de teste de memória de longa duração para eliminar o hardware como causa.
#
12
Sei que não é um problema de hardware, porque isso acontece em vários servidores. Obrigado por indicar que há algo ruim no capitão de código óbvio. Não estou culpando o visual studio. Conforme declarado, o aplicativo funciona bem por um período aleatório. Não é fácil reproduzir e eu tenho tentado identificar o problema há semanas.
Alguém mais
5
@Alsoone: Eu dificilmente acho que xingamentos vai lhe dar muita ajuda.
Mitch Wheat
2
@Algo mais, eu ajudei o máximo que pude, dadas as informações limitadas que você forneceu. Mesmo o melhor médico do mundo não pode fazer muito com um paciente que simplesmente declara "eu machuquei" :-) Se você deseja fornecer informações mais específicas, talvez possamos ajudar mais.
paxdiablo
5
Resposta ruim, mas abordagem, especulação vergonhosa, suposições injustificadas, nenhuma solução fornecida ... Por que essa resposta ainda está ativa? E que três pessoas poderiam ter votado positivamente nessa resposta?
ThunderGr
3

O código verificável não deve ser capaz de corromper a memória; portanto, há algo inseguro acontecendo. Você está usando algum código não seguro em qualquer lugar, como no processamento de buffer? Além disso, as coisas sobre o PInvoke podem não ser irrelevantes, pois o PInvoke envolve uma transição para código não gerenciado e empacotamento associado.

Minha melhor recomendação é anexar a uma instância com falha e usar o WinDBG e o SOS para aprofundar o que está acontecendo no momento da falha. Isso não é para os fracos de coração, mas nesse momento você pode precisar quebrar ferramentas mais poderosas para determinar o que exatamente está errado.

Dan Bryant
fonte
Ele menciona o PInvoke como uma possível causa na mensagem de erro. Não há código inseguro. Vou tentar o WinDBG. Obrigado.
Someone Else
3

Ok, isso pode ser bastante inútil e simplesmente anedótico, mas ...

Essa exceção foi lançada consistentemente por algumas bibliotecas Twain32 que estávamos usando no meu projeto, mas só aconteceria na minha máquina.

Tentei muitas soluções sugeridas em toda a Internet, sem sucesso ... Até desconectar o meu celular (ele estava conectado através do USB).

E funcionou.

Acontece que as bibliotecas Twain32 estavam tentando listar meu telefone como um dispositivo compatível com Twain, e algo que ele fez nesse processo causou essa exceção.

Vai saber...

almulo
fonte
3

Eu recebi esse erro ao usar o pinvoke em um método que faz referência a um StringBuilder. Eu tinha usado o construtor padrão que aparentemente aloca apenas 16 bytes. O Windows tentou colocar mais de 16 bytes no buffer e causou uma saturação do buffer.

Ao invés de

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

Use uma capacidade maior:

StringBuilder windowText = new StringBuilder(3000);
Charlie
fonte
2

no meu caso, o arquivo estava aberto e, portanto, bloqueado.

Eu estava conseguindo ao tentar carregar um arquivo do Excel usando o LinqToExcel que também foi aberto no Excel.

isso é tudo que eu fiz

    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);
    }
Sonic Soul
fonte
2

Eu recebi o mesmo erro em um projeto em que estava trabalhando no VB.NET. Verificar a opção "Ativar estrutura do aplicativo" na página de propriedades resolveu isso para mim.

Tony Raymond
fonte
1

Eu tive esse problema também . eu estava executando soluções diferentes ao mesmo tempo usando o visual studio; ao fechar outras soluções e executar apenas a solução de destino, funcionava bem sem esse erro.

ako
fonte
1

Obtive esse erro aleatoriamente no VS1017, ao tentar criar um projeto que estava sendo perfeitamente perfeito no dia anterior. A reinicialização do PC corrigiu o problema funcionado (eu também executei o seguinte comando anteriormente, não sei se é necessário: netsh winsock reset)

Eternal21
fonte
1
Essa é exatamente a minha situação no VS 2017 - System.AccessViolationException: tentativa de ler ou gravar memória protegida. Isso geralmente indica que outras memórias estão corrompidas. Simplesmente reiniciei o PC para resolver esse problema sem fazer mais nada.
Hong
0

Minha resposta depende muito do seu cenário, mas tivemos um problema ao tentar atualizar um aplicativo .NET para um cliente com mais de 10 anos para que eles pudessem fazê-lo funcionar no Windows 8.1. A resposta de @ alhazen estava no campo correto para mim. O aplicativo contava com uma DLL de terceiros que o cliente não queria pagar para atualizar (Pegasus / Accusoft ImagXpress). Nós direcionamos novamente o aplicativo para o .NET 4.5, mas cada vez que a seguinte linha era executada, recebíamos a AccessViolationException was unhandledmensagem:

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

Para corrigi-lo, tivemos que adicionar o seguinte evento pós-compilação ao projeto:

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

Isso especifica explicitamente o executável como incompatível com o Data Execution Prevention. Para mais detalhes veja aqui .

Barrie
fonte
0

Em alguns casos, isso pode acontecer quando:

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

No meu caso, tive que fazer referência a uma biblioteca C / C ++ usando P / Invoke, mas tive que garantir que a memória fosse alocada para a matriz de saída primeiro usando 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;
    }

Para obter detalhes, consulte: https://www.c-sharpcorner.com/article/pointers-in-C-Sharp/

user8128167
fonte
0

Isso aconteceu comigo quando eu estava depurando meu aplicativo C # WinForms no Visual Studio. Meu aplicativo faz chamadas para coisas do Win32 via DllImport, por exemplo

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

A execução do Visual Studio "como administrador" resolveu o problema para mim.

Netricidade
fonte
0

Eu tive a mesma mensagem de erro:

System.AccessViolationException: tentou ler ou gravar memória protegida. Isso geralmente indica que outras memórias estão corrompidas.

No meu caso, o erro desapareceu após a limpeza e reconstrução da solução.

Vivek Sharma
fonte
0

No meu caso, o utilitário FTDI FT Prog estava lançando o erro ao procurar dispositivos USB. Desconectar meus fones de ouvido Bluetooth do PC corrigiu o problema.

101
fonte
0

Recebi esta mensagem de erro na expressão lambda que estava usando o Linq para filtrar uma coleção de objetos. Quando inspecionei a coleção, notei que seus membros não estavam preenchidos - na Localsjanela, expandi-los apenas mostrava "...". Por fim, o problema estava no método de repositório que inicialmente preencheu a coleção - o Dapper estava tentando mapear automaticamente uma propriedade de um objeto aninhado. Corrigi a consulta Dapper para lidar com o multi-mapeamento e isso corrigiu o erro de memória.

melicent
fonte