- es.davy.ai/
- Programación /
- Depuración de excepción OnWndMsg en Windows C++, mensaje WM_TIMER. Menciones de bloqueo, Crash y IsWindowVisible.
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 EXCEPTIONACCESSVIOLATIONREAD.
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().
- ¿Puede IsWindowVisible() bloquearse con EXCEPTIONACCESSVIOLATION_READ?
Answer
Comments are closed.
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 mensajeWM_TIMER
. Sin embargo, hay cierta confusión ya que Sentry informa que el fallo se produce enCWnd::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:
CWnd::IsWindowVisible
, investiga cualquier código que pueda estar llamando a este método o manipulando ventanas.CWnd
oWM_TIMER
.