Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Hard debug :) (https://www.clubdelphi.com/foros/showthread.php?t=78346)

waremovil 11-04-2012 13:38:24

Hard debug :)
 
Esta consulta va a ser complicada, más que de programación es de debug ... pero me trae loco

Tengo un servidor funcionando 24/365 y tras unas actualizaciones importantes ha empezado a mostar mensajes de error (popups) del tipo "Access violation at address 0041BE9C"
cuando le da la gana, puede salir 5 veces en una mañana y estar luego dos días sin aparecer.

El problema es que he debugeado mil veces con y sin codegear y no consigo dar con el problema, he reproducido todas las situaciones pero no he
conseguido que el error salte.

El error no cierra la aplicación ni la interrumpe, tan sólo salta el popup y nada más. Siempre es en la misma dirección de memoria. ¿Podría debugear con Codegear a partir
de esa dirección de memoria? En caso negativo ¿algún consejo?

muchas gracias

Ñuño Martínez 11-04-2012 14:26:18

No dices qué sistema operativo usas, pero con GDB (el depurador de GNU) puedes depurar programas que ya estén iniciados. Para ello hay que saber el identificador del proceso. Sabiendo la posición de memoria puedes iniciar GDB, "interceptar" el proceso del servidor y poner un "break" para que cuando el proceso acceda a la posición de memoria se active y empezar a depurar. Claro que si dices que puede tirarse varios días sin salir el error pues es un problema, aunque creo que también puedes hacer que GDB avise de algún modo (al menos en sistemas POSIX, como puedes encadenar procesos como te da la gana, puedes hacer que envíe un mensaje de correo cada vez que GDB pare un proceso).

Yo GDB lo uso sólo para depuraciones simples, es decir, ejecución paso a paso, ver el contenido de variables, y poco más, así que no sé cómo se hace exactamente. Tiene muchísimas opciones y comandos.

waremovil 11-04-2012 16:51:04

gracias por tu aporte, el SO es Windows

actualmente compilo en win7 y los servidores se ejecutan en winxp y win7

El problema es, una vez más, que no puedo reproducir el error... he debugeado un montón de veces y reproducido todas las situaciones que se me ocurren,
pero no salta.

Sería genial poder rastrear el error a partir de la dirección de memoria del código que está accediendo a ese puntero nulo, estoy tratando de inventar el "reverse debug" :) :)

_cero_ 11-04-2012 17:53:48

Usas hilos? Quizás una mala sincronización entre ellos este causando el problema.

Mi recomendación es: desglosa el problema en problemas simples, hasta que encuentres cual da el problema (cuanto problema XD), es decir crea programas con partes de tu código que tu pienses que son las mas factibles de error y ejecútalas en bucle hasta que reproduzcas el error, de esta forma podrás ir acortando ese código hasta llegar ala función más simple. Esta forma de corrección me a ayudado en el mismo tipo de problemas (punteros inválidos debes en cuando), varias veces en el pasado.

También prueba en otra PC, cabe la posibilidad de que sea un problema de SO (a xp le encanta mostrar estos errores, casi sin justificación), o en el mas extraño de los casos, error de hardware.

Crandel 11-04-2012 18:02:47

Asi son los bugs, ocurren justamente por esa situación que no pensaste, asi que dificil que lo resuelvas sin saber exactamente cuales fueron esas condiciones.

Crea un log en tu aplicación y utiliza try catch

cuando entres a una función basicamente tendrias que escribir eso en tu log para saber por donde anda preferentemente con los datos de entrada, luego intenta capturar el error para lograr escribirlo en el log. A partir de ahi, empieza a aislarlo, agregando en tu log cada vez mas detalle.

mamcx 11-04-2012 18:07:38

Tambien puedes probar agregando http://madshi.net/madExceptDescription.htm o http://www.eurekalog.com/index_delphi.php. Delphi tiene un pesimo registro de excepciones, estos 2 productos agregan la habilidad de tener el stacktrace de estos asi sabes exactamente de donde viene el error.

AzidRain 11-04-2012 22:45:13

Huele a hilo chamuscado o memoria sin liberar. Aunque me inclino por lo primero ya que el programa sigue ejecutándose. Por lo recular las violaciones de acceso se deben a intentos de utilizar un objeto que ya se destruyó o bien que no ha sido creado (recordemos que una variable objeto es en realidad un vil puntero a un dirección de memoria). También puede ser una combinación de las 2 cosas, tal vez un hilo destruye un objeto que otro hilo trata de utilizar.


La franja horaria es GMT +2. Ahora son las 03:12:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi