 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
jc Lt JG

Registrado: 02 Mar 2004Mensajes: 68
|
Publicado: Mie 27 Oct, 2004 12:09 pm Asunto: Parar ejecución sin un breakpoint |
|
|
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 |
|
 |
_rockman2003 Invitado
|
Publicado: Mie 27 Oct, 2004 2:49 pm Asunto: |
|
|
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 |
|
 |
jc Lt JG

Registrado: 02 Mar 2004Mensajes: 68
|
Publicado: Mie 27 Oct, 2004 4:37 pm Asunto: |
|
|
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 |
|
 |
masBecas Lt

Registrado: 23 Oct 2003Mensajes: 98Ubicación: La Laguna, Tenerife
|
Publicado: Mie 27 Oct, 2004 5:42 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 28 Oct, 2004 12:24 pm Asunto: |
|
|
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 |
|
 |
jc Lt JG

Registrado: 02 Mar 2004Mensajes: 68
|
Publicado: Vie 29 Oct, 2004 12:07 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 29 Oct, 2004 1:15 pm Asunto: |
|
|
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  _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|