Estranho programa jeito, o que isso significa na depuração?
-
03-07-2019 - |
Pergunta
Programa Estranho jeito, o que isso significa na depuração?
Depois de anexar windbg eu encontrei o seguinte:
(1714.258): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. eax=015b5c74 ebx=178a13e0 ecx=dddddddd edx=009a8ca0 esi=09fbf698 edi=09fbf594 eip=005ae2f7 esp=09fbf4a4 ebp=09fbf594 iopl=0 nv up ei ng nz na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010286 TestApplication!std::_Container_base::_Orphan_all+0x57: 005ae2f7 c70100000000 mov dword ptr [ecx],0 ds:0023:dddddddd=????????
pilha de chamadas:
TestApplication!std::_Container_base::_Orphan_all+0x57 TestApplication!std::vector >::operator=+0x37 TestApplication!boost::asio::detail::win_iocp_io_service::do_one+0x189 TestApplication!boost::asio::detail::win_iocp_io_service::run+0xa2 TestApplication!boost::asio::io_service::run+0x3a
Solução
O problema
-
exceções de primeira chance significa que o depurador está lhe dando, a pessoa que está usando o depurador, a primeira chance para depurar a exceção, antes que ele joga de volta para o programa para lidar com a questão.
-
Neste caso, a exceção é "Violação de acesso". Isso significa que seu programa está a tentar ler / escrever a partir de um local de memória ilegal.
-
Violações de acesso é sério coz ele poderia estar corrompendo alguma memória que é crítico para o seu programa e este seria o motivo provável que seus programa paralisa.
-
A partir da instrução de falha parece que você está tentando obter o conteúdo de um valor de 4 bytes de uma instrução ilegal.
Depuração o problema
-
Se este é o seu código, então você pode facilmente depurar este problema, definindo a localização de símbolos de depuração para a pasta de seu compilador de saída (o que contêm os arquivos PDB relevantes)
-
Quando você receber essa exceção obter a pilha de chamadas (uma das janelas vista teria)
-
Isto mostrar-lhe o local em seu código onde a pilha de falha originou.
-
Agora, abra o arquivo que contém esta fonte e definir um ponto de interrupção lá e o programa teria atingido este ponto e parada dentro do windebugger. Debug a partir deste ponto e você saberia exatamente a partir do qual linha de código esta violação é jogado
Dica: impulso vem com fonte de modo que você pode facilmente colocar um ponto de ruptura dentro deste código. Certifique-se de pressionar F11 durante a depuração quando você chegar ao ASIO :: detalhe :: win_iocp_io_service :: do_one.
Outras dicas
Se você estiver usando MSVC ea configuração de compilação de depuração, 0xdddddddd
normalmente significa que você está tentando acessar memória liberada. O gerente de depuração de memória CRT enche de memória livre com 0xdd
.
O registo ecx tem um endereço inválido (dddddddd). Gostaria de sugerir este é um caso de corrupção de memória. Considere transformando gflags on para o processo.
A pilha de chamadas é inteiramente código STL / Boost. A menos que algo que você está fazendo é fora do comum, eu não vou assumir que o bug é em qualquer seção do callstack você colou.
Um par de coisas para verificar:
-
Qualquer #defines impulso específicos que devem ser definidos, mas Arent?
-
Segura SCL & Iterator depuração. Tente ativar / desativar-lo.
-
Você está misturando depuração e liberação de código. (Má idéia com recipientes STL / Boost)