FTP | CCD | Buscar | Trucos | Trabajo | Foros |
#1
|
|||
|
|||
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
__________________
http://www.qdsSoftware.com |
#2
|
||||
|
||||
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. |
#3
|
|||
|
|||
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"
__________________
http://www.qdsSoftware.com |
#4
|
|||
|
|||
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. |
#5
|
||||
|
||||
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.
__________________
[Crandel] |
#6
|
||||
|
||||
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.
__________________
El malabarista. |
#7
|
||||
|
||||
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.
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Debug de Delphi | Athalon | Varios | 11 | 06-12-2007 21:58:00 |
debug en delphi 7 | JoseAntonio | Varios | 5 | 27-07-2007 22:12:02 |
Debug en ActiveX | Elenita | Varios | 2 | 17-01-2006 13:06:24 |
Problema DEBUG!!! | neon | Varios | 1 | 06-04-2005 13:36:19 |
Debug | agonzalez | Varios | 16 | 02-07-2004 17:42:07 |
|