Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Control de errores por consola (Remote debugger)
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Control de errores por consola (Remote debugger) Responder citando

Hola a todos,

Sigo con mis problemas incomprensibles de ejecutar un programa en cualquier Windows, y al poner en un W2003 fallar.

Debido a mis problemas para depurar donde está el problema, os quiero hacer algunas preguntas:

1.- ¿Es posible conocer la ultima linea ejecutada? Conozco __LINE__ y __FUNC__, pero no se si es posible sacarlo sin meter una linea de log en cada linea del programa.

2.- He visto que en RAD2010 existe una consola. ¿Como puedo escribir en ella?

Muchas gracias


Ultima edición por rockman2003 el Mie 26 May, 2010 10:59 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

rockman2003 escribió:
Sigo con mis problemas incomprensibles de ejecutar un programa en cualquier Windows, y al poner en un W2003 fallar.

Que problemas ? Has conseguido aislar al menos en que función o haciendo que tarea falla ? Has probado en otro W2003 por si acaso sea algún detalle de configuración de esa máquina en concreto ?

rockman2003 escribió:
Debido a mis problemas para depurar donde está el problema

Si el problema es que no puedes depurarlo en la maquina donde está fallando.. podrías intentarlo con el depurador remoto.

rockman2003 escribió:
2.- He visto que en RAD2010 existe una consola. ¿Como puedo escribir en ella?

A que consola te refieres ?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_Leo escribió:

Que problemas ? Has conseguido aislar al menos en que función o haciendo que tarea falla ? Has probado en otro W2003 por si acaso sea algún detalle de configuración de esa máquina en concreto ?


Hola _Leo, gracias por contestar.

Te comento el problema que tengo.
Tengo definido una variable a modo de buffer donde almaceno información de todos los accesos de la base de datos que hago en el programa.
La variable es global y la tengo definida de la forma:

Código:

   //Estructura para almacenar los ultimos accesos
   typedef struct {
      String operacion;
      String funcion;
      int linea;
      String sql;
      String varios;
   } t_log_querys;

   t_log_querys* r_log_querys;
   int r_num_log_querys; //Indice


En el constructor hago:
Código:

#define MAX_LOG_QUERYS_GUARDADAS 50

...

r_log_querys = new t_log_querys[MAX_LOG_QUERYS_GUARDADAS]; //Almaceno las ultimas querys



Una vez definida la variable, tengo una función que llamo cada vez que accedo a la base de datos. La funcion es como sigue:

Código:

void AccesoBD::guardar_log_query(const String &funcion,int linea,const String &sql,const String &operacion,const String &varios)
{
try {

   int que_fila = r_num_log_querys;
   if (r_num_log_querys>=MAX_LOG_QUERYS_GUARDADAS)
   {
     r_num_log_querys=0;
   }
   else
   {
     r_num_log_querys++;
   }
   r_log_querys[r_num_log_querys].operacion=operacion;
   r_log_querys[r_num_log_querys].funcion=funcion;
   r_log_querys[r_num_log_querys].linea=linea;
   r_log_querys[r_num_log_querys].sql=sql;
   r_log_querys[r_num_log_querys].varios=varios;
} catch (...) {
}
}



Bien, pues este código me ha funcionado sin problemas en Builder 6, y al migrarlo a RAD2010, no he tenido problemas ni en W XP, ni en W 7, Vista...

Pero, en W2003 (Probado en 2 ordenadores distintos) me cascaba cuando entraba 6 o 7 veces en la funcion.
La manera que he arreglado el problema es añadiendo las lineas de try{}catch(...){} que engloba toda la funcion.


_Leo escribió:

Si el problema es que no puedes depurarlo en la maquina donde está fallando.. podrías intentarlo con el depurador remoto.


La verdad que habia oido hablar de él pero nunca lo he probado. Veré que puedo hacer.


_Leo escribió:

A que consola te refieres ?


A ver si me explico mejor. Cuando trabajo con Java, utilizo mucho la consola con el comando System.out.println(); En RAD2010 he visto que existe algo parecido a dicha consola. ¿Si mando un fprintf(stderr,"Hola") o printf("Hola") me aparecerá en dicha ventana?

Esto me gustaría utilizarlo para poder dejar lineas de codigo a modo de traza que no generen ficheros ni nada parecido.
Basicamente lo que quiero es saber por donde pasa de mi programa y en que linea me dio el casque. De ahí mi pregunta de si hay alguna manera de saber desde que linea del código se salta a un catch.


Siento el tostonazo que acabo de soltar.
Un saludo
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

rockman2003 escribió:
La manera que he arreglado el problema es añadiendo las lineas de try{}catch(...){} que engloba toda la funcion.

Pero da algún mensaje ? salta alguna excepción ?

rockman2003 escribió:
Cuando trabajo con Java, utilizo mucho la consola con el comando System.out.println(); En RAD2010 he visto que existe algo parecido a dicha consola. ¿Si mando un fprintf(stderr,"Hola") o printf("Hola") me aparecerá en dicha ventana?

Esto funciona cuando creas una aplicación en modo consola. Aunque también si quieres puedes crear una ventana de consola en una aplicación gráfica..

Crea un archivo con el nombre "consola.h" por ejemplo, y pega el siguiente código:
Código:
#ifndef ConsolaH
#define ConsolaH
//--------------------------------------------------------------
#ifdef _DEBUG
void println_(AnsiString file, AnsiString num, AnsiString str)
{
    static HANDLE out = 0;
    if (!out) {
        AllocConsole();
        out = GetStdHandle(STD_OUTPUT_HANDLE);
    }
    DWORD n;
    str = ExtractFileName(file) + ":" + num + "> " + str + "\n";
    WriteFile(out, str.c_str(), str.Length(), &n, 0);
}
  #define println(s) println_(__FILE__, __LINE__, s)
#else
  #define println(s)
#endif
//--------------------------------------------------------------
#endif

Añade la cabecera donde necesites usar la consola, y para usarla, por ejemplo:
Código:
println("esto es una prueba");
Esto mostrara en la consola algo así:
Código:
Unit1.cpp:36> esto es una prueba
Unit2.cpp:19> otra prueba...

(Solo se creara la consola cuando compiles la aplicación en modo DEBUG, cuando la compiles en modo RELEASE se ignoraran esas líneas)

También tienes otra forma de ver los mensajes, en vez de usar una consola, los mensajes serán enviados al depurador (ventana: Event log) o bien puedes usar en el cliente un pequeño ejecutable gratuito (DebugView) y que no necesita instalación para ver esos mensajes cuando quieras (esta herramienta no captura los mensajes cuando ejecutas el programa desde el IDE). Para ello cambiamos el código de la función "println_" en la cabecera, por:
Código:
void println_(AnsiString file, AnsiString num, AnsiString str)
{
    str = ExtractFileName(file) + ":" + num + "> " + str + "\n";
    OutputDebugString(str.c_str());
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_Leo escribió:

Pero da algún mensaje ? salta alguna excepción ?


El error es un típico Access Violation at address ...

Gracias _Leo
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Usando el código que pones no consigo que me falle en un "Windows 2003 Server R2" (haciendo miles de llamadas).

Si tienes algún pequeño proyecto solo con la parte que te falla, que permita reproducir el problema y quieres que pruebe algo..:

leosoftware ARROBA gmail PUNTO com
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola _Leo, voy a intentar enviarte el código que pueda, aunque lo veo dificil, por su tamaño.

Por otro lado, estoy comenzando a probar el depurador remoto.
¿Es el puerto 8000 al que tengo que hacer NAT para probar el depurador remoto?


Muchas gracias por tu ayuda
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Olvida esta ultima cuestión.

El puerto por defecto es el 64447

Si lo quieres cambiar, se ejecuta

Código:

rmtdbg120.exe -listen 8000
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola.
Pido disculpas anticipadas si me meto donde no me llaman, pero quisiera averiguar como en una empresa de soft que usaba delphi 2007 (ahora usan 2009) usan una especie de ventana-debug con el mismo programa instalado para el user y en la misma pantalla. Esta gente usa un programa de acceso remoto y desde la pantalla, activaron un "reg". Arrancaron el programa y en la parte izquierda apareció una ventana con las lineas del código. Podían hacer breaks y paso a paso como si estuvieran dentro del ide

Puede ser que a rockman2003 le vaya bien eso, pero ¿como se hace? ¿es un componente aparte? La lástima es que no pille el "reg" para poder hacer pruebas

Saludos, Bosoft
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Je, pues me vendría de perlas Wink

Yo sigo intentando hacer funcionar el Remote Debug con el manual que me ha pasado _Leo. Por ahora pruebo en una red local, porque con NAT en remoto me salta un error en el RAD2010 y se me cierra.

Os mantendré informados... y si me decis de algun otro programa de Depuración Remota, me haríais padre... otra vez.

Un saludo
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Intentare explicar un poco como usar el depurador remoto:

1.- Instalamos el "depurador remoto" en la máquina del cliente (el instalador lo podemos encontrar en el DVD de instalación y en la web de Embarcadero) y lo ejecutamos.

2.- Ahora copiamos los ejecutables, dlls etc.. de nuestro proyecto en la máquina del cliente, y el detalle más importante, también los archivos .TDS (que contienen las tablas de símbolos).

3.- En nuestra maquina abrimos el proyecto con el código fuente de la versión con la que compilamos los ejecutables del cliente (si fuera necesario volver a copiarle al cliente los ejecutables que concuerden con ese código fuente).

4.- Ahora vamos a la opción: "MENU: Run -> Load Process.. -> TREEVIEW: Remote" y ahí rellenamos los campos siguientes:

    "Remote path:", ahí ponemos la ruta completa del ejecutable en la máquina del cliente (por ejemplo: c:\miproyecto\project1.exe)

    "Remote host:", ahí ponemos la IP de la maquina donde está instalado el depurador remoto.

(El resto de datos es opcional y podemos mirar para que sirve cada uno en la ayuda)

5.- Y finalmente pulsamos el botón: "LOAD" y se ejecutara automáticamente el programa en la máquina del cliente, mientras en nuestra maquina vemos como se selecciona la línea en el código fuente que se está ejecutando.

(Es recomendable usar el VNC, el escritorio remoto de Windows, o algún programa similar que nos permita ver la pantalla del cliente...)

Y eso es todo, es así de simple, PERO..

¡NOTA IMPORTANTE!:

Hay un pequeño detalle “mágico” Wink que hay que hacer antes de empezar con todo esto si queremos que el sistema funcione correctamente, y es cambiar un valor en el registro, y digo “mágico”, porque Borland tiene la mala costumbre de documentar poco, y aunque el proyecto haya cambiado de empresa no ha cambiado de personal, que como se ve les cuesta perder las malas costumbres ..

El valor que hay que modificar es el siguiente (en la versión 2010, en otras cambiar el número de versión que corresponda, así como la palabra Borland, Codegear o Embarcadero). En la rama:

    HKEY_CURRENT_USER\Software\CodeGear\BDS\7.0\Debugging\Embarcadero Debuggers

El valor: "Disable Multiple Evaluators", que por defecto tiene el valor "1", le damos el valor "0".

Espero que se haya entendido..
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Jurrrlll

Gracias!!!

Pero el NAT en el router del cliente hay que hacerlo ¿no?. Lo que he comentado sobre el puerto 64447 es cierto, verdad?
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Si, el puerto hay que abrirlo en el router y asegurarse de que no lo bloquee algún cortafuego. Es el puerto por defecto que has dicho, y también como has dicho arriba la forma de cambiarlo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Ya que estás en ello, _Leo: ¿sabes algo de lo que he contado 4 pots mas arriba?. La curiosidad me mata

Saludos, Bosoft
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

No, no me suena ningún depurador que vaya integrado en el propio programa.

Normalmente si no estoy seguro de que algo vaya a funcionar bien en alguna versión del sistema operativo lo pruebo en una máquina virtual.. y cuando hay algún caso especial de un error "misterioso" en el cliente, el depurador remoto va bien.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.