Sistem de depanare a aplicatiilor in limbajul C-plus-plus
From linux360
Acest tutorial de programare este realizat cu ajutorul Bibliotecii Qt versiunea 3.x, dar se poate adapta uşor folosind orice altă bibliotecă.
Când dezvoltăm aplicaţii de proporţii (sau poate mai simple), pot aparea momente în care aplicaţia noastră să nu mai facă ce ne aşteptam noi sa faca şi incepem să ne punem (firesc) întrebarea "Acum ce s-a mai întâmplat?".
Pentru a ne ajuta în această privinţă, ne putem construi o mulţime de unelte. Voi enumera o parte dintre ele:
- depanare prin executia programului folosind breakpoints si/sau linie cu linie;
- scrierea unor mesaje într-un fişier de log;
- scrierea unor mesaje într-o consola;
- aruncarea şi prinderea excepţiilor;
Folosirea unor breakpoints nu face cazul acestui tutorial. Aruncarea şi prinderea excepţiilor este o tehnologie mult prea complex pentru a fi detaliat aici; există suficient material pe internet pentru aceasta.
Mesaje intr-o consola
Sa presupunem ca la un moment dat avem nevoie sa obtinem valorile unor variabile care nu se pot afla prin breakpoints; de exemplu într-o funcţie de reîmprospatare a unei ferestre, care se apelează într-un ciclu infinit. Aceste valori le putem afla prin două modalitaţi: scrierea lor intr-un fişier de log sau afişarea lor intr-o consolă. Fiecare dintre cele două are avantaje şi dezavantaje.
consolă - avantaje (faţă de log):
- mesajele se pot urmări În timpul rulării programului
- nu necesită spaţiu suplimentar pe Hard Disk Drive (HDD)
consolă - dezavantaje (faţă de log):
- consumă resurse suplimentare
- Crearea consolei
- kdsconsole.h
/*************************************************************************** * Copyright (C) 2005 Radu Bolovan * * radubolovan@dainet.ro * * * * This is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef KDSCONSOLE_H #define KDSCONSOLE_H #include <qtextedit.h> class KDSConsole : public QTextEdit { public: KDSConsole( QWidget *parent = 0, const char *name = 0 ); ~KDSConsole(); }; extern KDSConsole *g_pConsole; #endif
- kdsconsole.cpp
#include "kdsconsole.h" KDSConsole *g_pConsole = NULL; KDSConsole::KDSConsole( QWidget *parent, const char *name ) : QTextEdit( parent, name ) { setReadOnly( true ); setAlignment ( Qt::AlignLeft ); setMinimumSize( 640, 150 ); } KDSConsole::~KDSConsole() {}
Dupa cum se vede am declarat şi definit o variabilă globală de tipul KDSConsole, externă - pentru a o putea apela din orice fişier. Pentru folosirea unui astfel de obiect (KDSConsole) voi mai adăuga incă două metode, faţă de cel obişnuit:
g_pConsole = new KDSConsole(); //ceva cod g_pConsole->append( "Test in consola" ); //functia append() apartine clasei QTextEdit //alt cod delete g_pConsole;
1) Trei funcţii statice ale unei clase:
- kdsutils.h
#ifndef KDSUTILS_H #define KDSUTILS_H #include "kdsconsole.h" #include <qstring.h> class KDSUtils { public: KDSUtils(){;} ~KDSUtils(){;} static void InitConsole(){ g_pConsole = new KDSConsole(); } static void AppendToConsole( QString str ){ if( g_pConsole ) g_pConsole->append( str ); } static void DestroyConsole(){ if( g_pConsole ) { delete g_pConsole; g_pConsole = NULL; } } }; #endif
Acestea se pot apela (după cum se cunoaşte) prin:
KDSUtils::InitConsole(); //numai la initializarea aplicatiei //ceva cod KDSUtils::AppendToConsole( "Un text in consola" ); //alt cod KDSUtils::DestroyConsole(); //cand nu mai avem nevoie de consola
2) Trei macro-uri:
- kdsdefs.h
#ifndef KDSUTILS_H #define KDSUTILS_H #include "kdsconsole.h" #include <qstring.h> #define INIT_CONSOLE() KDSUtils::InitConsole() #define KDS_TRACE( string ) KDSUtils::AppendToConsole( string ) #define DESTROY_CONSOLE() KDSUtils::DestroyConsole() #endif
Observatii: 1) Nu folosiţi mai mult de una dintre cele trei metode!!! 2) Acelaşi efect se poate obţine punând
printf( "Un text catre consola" );
oriunde in cod si rularea programului din consolă (KConsole) 3) Funcţia de adăugare a unui text în consolă se mai poate implementa astfel încat sa primească un numar nelimitat de parametrii şi să funcţioneze analog funcţiei sprintf().
--Radu Bolovan 01:32, 21 December 2005 (EET)