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 

Parar ejecución sin un breakpoint

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Parar ejecución sin un breakpoint Responder citando

Hola a todos:

Pues eso, mi aplicación se pierde en algún punto o bucle que no tengo ni idea de dónde puede estar.

¿Existe alguna forma de parar la ejecución de forma incondicional sin poner un breakpoint? Es decir pararla y ver dónde está ejecutándose ya que como he dicho antes no sé dónde poner el breakpoint.

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

Si no tienes ni idea de donde falla ejecuta el programa pulsando F8 en vez de F9, y así irás linea por línea desde el mismo principio.

No se si esto te podrá ayudar
Volver arriba
Mensaje    Asunto: Responder citando

El problema es el nº de líneas del programa y las operaciones que hace.
Me puedo tirar una semana ejecutando paso por paso con F8 o F7.

Gracias y un saludo.
JC
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

La verdad que desconozco si hay alguna manera de detener la ejecución e ir al código en un momento determinado.
La única que conozco de hacerlo es con un breakpoint, localizando previamente la línea en la que falla.
Para localizar la línea te recomiendo que vayas imprimiento mensajitos por pantalla (o incluso a un fichero) para ir viendo por donde vas y de esta forma localizar en qué momento se ha metido en un bucle infinito tu programa.
Sé que es un método un poco chapucero pero realmente no conozco otro mejor de localizar un error.
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Lo que te sugiere masBecas es la mejor solución. A mi me ha ocurrido y no me ha quedado más remedio que ir poniendo mensajes que vuelcan a un fichero. Te pongo el código que yo he usado:

    1. La declaración va en __published del fichero de cabecera:
    Código:
    void __fastcall GrabaLog(AnsiString cLinLog, AnsiString cNomFunc, int cNumLin);

    2. En el programa declaro la función:
    Código:
    void __fastcall TfFomr1::GrabaLog(AnsiString cLinLog, AnsiString cNomFunc, int cNumLin)
    {
         cLinea = "";
         if (!cNomFunc.IsEmpty())
              cLinea = cLinea + " Fc: " + cNomFunc.SubString(cNomFunc.Pos("::") + 2, cNomFunc.Length());
         if (cNumLin != NULL)
              cLinea = cLinea + AnsiString::StringOfChar(' ' , 25 - cLinea.Length()) + "Ln: " + IntToStr(cNumLin);

         cLinLog = cLinLog + AnsiString::StringOfChar(' ' , 50 - cLinLog.Length()) + cLinea;
         if (!cLinLog.IsEmpty() && (fLog = fopen(cLog.c_str(), "a+")) != NULL)
         {
              fprintf(fLog, "%s%s\n", (Now().FormatString("dd/mm/yyyy hh:nn:ss » ")).c_str(), Trim(cLinLog).c_str());
              fclose(fLog);
         }
    }

    3. Y donde me interesa llamo a la función:
    Código:
    GrabaLog("EJECUTA UPDATE " + qQuery->Name, __FUNC__, __LINE__);

Las intrucciones __FUNC__ y __LINE__ las encontré después de preguntar por aquí como podría saber en donde se estaba ejecutando el programa . Si tienes alguna duda, pregunta.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Lo siento mucho, pero no entiendo nada.

Ese código me da un montón de errores. ¿Me lo puedes dar con mas detalles? (definición de las variables, librerías necesarias, etc...)

Muchas gracias por tu ayuda y un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Perdona si en la nota anterior no expliqué nada. ¡Las prisas! Vamos por partes.

1. Llamadas __FUNC__ y __LINE__
Son propias de Builder y no hay que añadir ninguna librería. Las tienes explicadas, junto con otro montón de llamadas, en el capítulo Predefined macros de la ayuda de Builder. La primera te indica el nombre de la función que se está ejecutando y la segunda el número de línea del código.

2. Definición de la función
En el fichero .h del formulario que quieras rastrear debes incluir esa definición en la sección __published. Te quedaría algo así:
Código:
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
     void __fastcall GrabaLog(AnsiString cLinLog, AnsiString cNomFunc, int cNumLin);
private:   // User declarations
public:      // User declarations
     __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Te explico la definición:
    cLinLog » Mensaje que se va a grabar en el fichero de texto.
    cNomFunc » Nombre de la función que se ejecuta, extraído con __FUNC__
    cNumLin » Línea que se está ejecutando, extraído __LINE__


3. Ejecución de la llamada
El código que te he puesto abrea un fichero, graba el mensaje y lo cierra. Viendo ahora el código es cierto que se me han olvidado algunas cosas. Pongo el código corregido aquí. Hace falta stdio.h
Código:
AnsiString cLinea = "";
AnsiString cLog ="FicheroLog.txt";
FILE *fLog

if (!cNomFunc.IsEmpty())
     cLinea = cLinea + " Fc: " + cNomFunc.SubString(cNomFunc.Pos("::") + 2, cNomFunc.Length());

if (cNumLin != NULL)
     cLinea = cLinea + AnsiString::StringOfChar(' ' , 25 - cLinea.Length()) + "Ln: " + IntToStr(cNumLin);

cLinLog = cLinLog + AnsiString::StringOfChar(' ' , 50 - cLinLog.Length()) + cLinea;
if ((fLog = fopen(cLog.c_str(), "a+")) != NULL)
{
     fprintf(fLog, "%s%s\n", (Now().FormatString("dd/mm/yyyy hh:nn:ss » ")).c_str(), Trim(cLinLog).c_str());
     fclose(fLog);
}

Vamos de a poquito.
cLinea » Variable auxiliar de trabajo.
cLog » Nombre del fichero log.

Al recuperar el nombre de la funcióncon FUNC, lo trae completo; por ejemplo: TForm1::Button1Click; lo que hago en el primer if es quedarme sólo con lo que hay a la derecha de los puntos (en este caso sería Button1Click)

El segundo if inserta en la variable el número de línea recuperado con LINE. Para hacerlo má claro, adorno un poco la línea, de forma que el trozo donde va el nombre de función tenga 25 posiciones, incluyendo blancos. Esto lo hago con la funcion StringOfChar (viene en la ayuda de Builder).

Una vez que tengo esto montado (quedaría por ejemplo: Fc: Button1Click Ln: 37), se lo añado al mensaje que le he pasado en cLinLog. Imagina que pasas el mensaje "ESTOY AQUí". La llamada sería:
Código:
GrabaLog("ESTOY AQUÍ", __FUNC__, __LINE__);

y el resultado podría quedar así:
Código:
ESTOY AQUI     FC: Button1Click   Ln: 37

Si no te lo he explicado bien, pregunta que yo para dar clases soy muy malo Wink
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
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.