es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Depuración de excepción OnWndMsg en Windows C++, mensaje WM_TIMER. Menciones de bloqueo, Crash y IsWindowVisible.

Tengo un bloqueo que está siendo capturado en Sentry.

CWnd::IsWindowVisible
No controlado
Error fatal: EXCEPTIONACCESSVIOLATION_READ

Descargué el archivo de volcado en miniatura (dmp) y lo ejecuté a través de Visual Studio 19. El bloqueo está ocurriendo en el método:

BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)

Estoy incluyendo una captura de pantalla porque una de mis preguntas es:

¿Exactamente dónde ocurre el bloqueo? ¿La línea (captura de pantalla) representa realmente el bloqueo?

Usando el depurador puedo ver que el parámetro “message” que llega al método es 275, lo cual es:

0113 275 WM_TIMER

Ver por ejemplo: https://wiki.winehq.org/ListOfWindowsMessages.
Mis preguntas:
1. ¿Dónde exactamente ocurre el bloqueo? No entiendo cómo comprobar si “pResult” es NULL y asignar “lResult” a *pResult podría causar un bloqueo de ningún tipo y ciertamente no EXCEPTION
ACCESSVIOLATIONREAD.
2. En previsión de que alguien afirme que la excepción realmente está en otro lugar…
a. ¿Cómo obtengo la ubicación/problema exacto del volcado?
b. ¿Alguien reconoce este tipo de problema con los temporizadores? No es mi código, pero ya estoy imaginando cosas como múltiples paradas de temporizadores, hacer algo en una ventana que ya no existe, etc. Basado en EXCEPTIONACCESSVIOLATION_READ.
3. ¿Alguna pista/idea de cómo proceder?

Como siempre, si es mejor preguntar en otro grupo o si se necesita más aclaración, por favor avísenme.
¡Gracias!

EDITAR – INFORMACIÓN ADICIONAL
Tenga en cuenta que Sentry dice que el programa está bloqueándose en IsWindowVisible. Eso ciertamente no está presente en la depuración del archivo de volcado (que yo pueda ver) y el punto de bloqueo que se muestra en la captura de pantalla no lo muestra, pero podría tener sentido. La rutina OnTimer ciertamente menciona IsWindowVisible().

  1. ¿Puede IsWindowVisible() bloquearse con EXCEPTIONACCESSVIOLATION_READ?

Imagen

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Respuesta

    ¿Dónde exactamente se produce el fallo?

    Según la información proporcionada, el fallo se produce en el método CWnd::OnWndMsg cuando se recibe un mensaje WM_TIMER. Sin embargo, hay cierta confusión ya que Sentry informa que el fallo se produce en CWnd::IsWindowVisible. Es posible que el fallo esté relacionado con ambos métodos y requiera una investigación más detallada.

    ¿Cómo obtengo la ubicación/problema exacto(a) a partir del volcado (dump)?

    Para obtener la ubicación exacta del problema a partir del archivo de volcado, puedes analizarlo utilizando una herramienta como WinDbg o el Depurador de Visual Studio. Estas herramientas te permiten inspeccionar la pila de llamadas, las variables y la memoria en el momento del fallo. Puedes utilizar esta información para identificar la causa raíz del problema.

    ¿Alguien reconoce este tipo de problema con los temporizadores (timers)?

    Es posible que el fallo esté relacionado con múltiples paradas de temporizadores o al hacer algo en una ventana que ya no existe. Sin más contexto o código, es difícil decirlo con certeza. Sin embargo, según el error EXCEPTION_ACCESS_VIOLATION_READ, es probable que el fallo se produzca debido a una violación de acceso a la memoria.

    ¿Alguna pista/idea sobre cómo proceder?

    Algunas sugerencias sobre cómo proceder incluyen:

    1. Intenta reproducir el problema localmente y observa si puedes obtener más información sobre el fallo. Puedes intentar agregar más registros o utilizar un depurador para seguir el código paso a paso.
    2. Revisa el código en busca de problemas relacionados con los punteros o fugas de memoria que puedan estar causando el fallo.
    3. Busca cambios o actualizaciones recientes que puedan haber introducido el problema.
    4. Si el problema está relacionado con CWnd::IsWindowVisible, investiga cualquier código que pueda estar llamando a este método o manipulando ventanas.
    5. Considera comunicarte con otros equipos de desarrollo o foros para ver si alguien ha experimentado problemas similares con los mensajes CWnd o WM_TIMER.

Comments are closed.