Pregunta

Bloqueo extraño del programa, ¿qué significa esto en la depuración?

Después de adjuntar windbg encontré lo siguiente:

(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=????????

Pila de llamadas:

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
¿Fue útil?

Solución

El problema

  1. Las excepciones de primera oportunidad significan que el depurador le da a usted, la persona que usa el depurador, la primera oportunidad de depurar la excepción, antes de que la devuelva al programa para manejar el problema.

  2. En este caso, la excepción es " Violación de acceso " ;. Esto significa que su programa está intentando leer / escribir desde una ubicación de memoria ilegal.

  3. Las infracciones de acceso son graves, ya que podría dañar la memoria, lo que es crítico para su programa, y ??esta sería la razón probable por la que su programa se cuelga.

  4. A partir de la instrucción con fallas, parece como si estuviera tratando de obtener el contenido de un valor de 4 bytes de una instrucción ilegal.

Depurando el problema

  1. Si este es tu código, entonces puedes depurar fácilmente este problema configurando la ubicación del símbolo de depuración en la carpeta de salida de tu compilador (esto contendría los archivos pdb relevantes)

  2. Cuando obtenga esta excepción, obtenga la pila de llamadas (una de las ventanas de visualización la tendrá)

  3. Esto le mostraría la ubicación en su código donde se originó la pila defectuosa.

  4. Ahora abra el archivo que contiene esta fuente y establezca un punto de interrupción allí y el programa alcanzará este punto y se detendrá dentro del Windebugger. Depure desde este punto y sabría exactamente de qué línea de código se produce esta violación

Sugerencia: Boost viene con la fuente para que pueda colocar fácilmente un punto de interrupción dentro de este código. Asegúrese de presionar F11 mientras realiza la depuración cuando llegue a asio :: detail :: win_iocp_io_service :: do_one.

Otros consejos

Si está utilizando MSVC y la configuración de compilación de depuración, 0xdddddddd generalmente significa que está intentando acceder a la memoria liberada. El administrador de memoria CRT de depuración llena la memoria libre con 0xdd .

El registro ecx tiene una dirección no válida (dddddddd). Yo sugeriría que este es un caso de corrupción de memoria. Considere la posibilidad de activar gflags para el proceso.

La pila de llamadas es completamente código STL / Boost. A menos que algo que estés haciendo esté fuera de lo común, no asumiré que el error está en ninguna sección de la pila de llamadas que hayas pegado.

Un par de cosas para verificar:

  1. ¿Alguna #define específica de Boost que debería definirse pero no está disponible?

  2. Asegurar SCL & amp; Depuración del iterador. Intenta habilitarlo / deshabilitarlo.

  3. ¿Estás mezclando debug & amp; código de liberación (mala idea con los contenedores STL / Boost)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top