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
Foi útil?

Solução

O problema

  1. 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.

  2. 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.

  3. 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.

  4. 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

  1. 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)

  2. Quando você receber essa exceção obter a pilha de chamadas (uma das janelas vista teria)

  3. Isto mostrar-lhe o local em seu código onde a pilha de falha originou.

  4. 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:

  1. Qualquer #defines impulso específicos que devem ser definidos, mas Arent?

  2. Segura SCL & Iterator depuração. Tente ativar / desativar-lo.

  3. Você está misturando depuração e liberação de código. (Má idéia com recipientes STL / Boost)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top