[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: DDD POR FAVORR>>



On 5 Aug 2003, Cesar Rincon wrote:

> On Tue, 2003-08-05 at 01:46, Antonio Castro wrote: 
> > On 4 Aug 2003, Cesar Rincon wrote:
> > > Nunca he usado DDD pero, como ya te decía hace unos días, en GDB el
> > > comando 'step' debe funcionar *siempre* como indicas: entrando en las
> > > subrutinas (excepto cuando la subrutina está en una biblioteca enlazada
> > > sin información de debug).  El comando 'next' es el que salta las
> > > subrutinas.
> > 
> > A mi me parece que eso no es cierto. Todos los debugger son susceptibles
> > de perderse. Yo creo que un puntero descontrolado puede llegar a afectar 
> > al correcto funcionamiento del debugger. No es algo corriente per puede
> > llegar a pasar.
> 
> Es algo poco corriente, en efecto: tánto que no recuerdo que me haya
> pasado con GDB, excepto cuando se genera un SIGSEGV o SIGBUS en
> programas con threads o que hacen fork().  En cualquier caso, yo creo
> que un debugger tiene mejores posibilidades que tu sistema de "trazas"
> de sobrevivir una implosión del programa causada por un apuntador
> corrupto.

La traza se expande en el lugar donde tu la pones. Antes de eso todo
el entorno de ejecución es exactamente el mismo. A mi me ha pasado
con depuradores varias cosas. El depurador se va a freir puñetas o
se despista y hace las cosas mal, o lo peor de todo: El programa desde
el depurador funciona exactamente como tu esperabas. 

Es cierto que los depuradores dan muchísimo juego y este tipo de 
problemas ocurre en rarísimas ocasiones. Merece la pena usarlos.

> Muy bonito e ingenioso, tu código, de cualquier forma.  Mucho más fino
> que mis habituales printf()s :-)  Es poco portable, sin embargo: los

El gran problema del printf es que no tienes la garantía de que esa
traza aparezca. Violación de segmento por ejemplo te dejará los datos 
de salida perdidos en el buffer de salida. printf por las buenas no 
sirve. Ni siquiera sirve el fflush(). Yo abro y cierro a cada salida 
de la traza para garantizar completamente su salida.

Depurar con trazas es el sistema más anticuado de todos pero aun así
tiene su utilidad.

> macros variádicos son una adición de C99, y el estándar manda el uso de
> la construcción __VA_ARGS__ (no tengo una copia de C99 ahora mismo, pero
> estoy casi seguro de que 'args...' es una extensión de GNU---ve la
> sección de macros variádicos en el manual de CPP).  En el mismo tenor,
> __FUNCTION__ es una extensión de GNU, no una construcción estándar (a
> diferencia de __FILE__ y __LINE__).

Supongo que si se puede hacer una versión más portable pero a mi lo
de usar __FUNCTION__ me ayuda mucho. Se podría hacer un

#ifdef __FUNCTION__

Es un sistema perfectamente prescindible o sustituible. 

Sustituyendo  '#define ENABLE_TRAZA 1' por '/* #define ENABLE_TRAZA 1 */'
la traza deja de tener efecto y el precompilador eliminará la parte 
no portable del código y por eso no me parece demasiado grave. 

Lo reconozco, no he compartido proyectos en C con otros desarrolladores de
software libre y por eso quizás voy un poco por libre buscando lo que
mas me interesa a mi a la hora de programar. También he usado bastante 
el gdb que me parece excelente y parece más fiable que otros depuradores 
que he tenido que padecer. Quizás esté un pelín condicionado por esas malas
experiencias. En alguna ocasión perdí algunos días de trabajo antes de darme 
cuenta de que el depurador me estaba tomando el pelo.

> Un truco que he usado para evitar los macros variádicos, y aún así tener
> semántica de printf() y desactivación del código de log redefiniendo
> macros, es el siguiente:
> 
> void funcion_de_log(const char* formato, ...);
>  #define MI_LOG(_nivel_de_log, _params)\
>   do {\
>    if(_nivel_de_log <= nivel_global_de_log) funcion_de_log _params ;\
>   } while(0)
> 
> Eso se usa así:
> 
>  MI_LOG(LOG_DEBUG, ("Error %d", e));

Muy curioso.

-- 
Un saludo
Antonio Castro

       /\     /\   Ciberdroide Informática 
         \\W//  << http://www.ciberdroide.com >>
        _|0 0|_                                                    
+-oOOO-(___o___)-OOOo---------------------+ 
| . . . . U U . Antonio Castro Snurmacher |  
| . . . . . . . acastro@ciberdroide.com   | 
+()()()---------()()()--------------------+



Reply to: