Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour cher tous,
Est t'il possible, pendant que l'application est en train de tourner de pouvoir rediriger toutes les différentes traces d'execution dans un fichier que l'on aura au préalable définie de telle en sorte qu'en parcourant ce fichier l'on puisse avoir une idée de ce qui s'est passée depuis le lancement de l'éxecution.
Si cela est possible, comment procéder?
Bonne journée à vous
Hors ligne
Bonjour,
Il suffit de lancer l’exécutable en ligne de commande en ajoutant /PBDEBUG.
Hors ligne
Bonjour buck,
J'ai essayé ce que tu m'as demandé, j'obtiens un fichier avec une extension .dbg. En l'ouvrant avec un éditeur de texte, les résultats contenu ne sont pas ceux auquelles je m'attendais.
Si je fais une requette par exemple
INSERT INTO MA_TABLE(nom,prenom) values (:nom, :prenom) using transac;
Je voudrais pouvoir avoir à peu près ceci dans le fichier de trace INSERT INTO MA_TABLE(nom, prenom) values (Dupont, fabrice) using transac;
Merci
Hors ligne
buck a écrit:
Bonjour,
Il suffit de lancer l’exécutable en ligne de commande en ajoutant /PBDEBUG.
ça produit un fichier texte indenté énorme et pas forcément utilisable si on cherche à tracer quelque chose assez longtemps après le démarrage de l'appli : PB doit avoir un bug et seuls les quelques derniers milliers d'évènements seront présents mais l'indentation risque d'être cassée et illisible. De plus cela ralentit énormément l'application car PB ouvre / ajoute un évènement / referme le fichier à chaque ligne qu'il essaie de tracer... à tout hasard, xlat a fait un viewer pour les pbtraces qui rend la lecture un peu moins fastidieuse.
Il y a une autre possibilité : on peut utiliser l'api PB de profiling (ce qu'on voit dans l'onglet Tools / System options / Profiling de l'IDE) pour démarrer et arrêter le profiling pour un moment de l'exécution qu'on souhaite analyser :
- création d'un fichier .pbp
- sélection d'un type de timer + les types de traces qu'on veut
On peut analyser les résultats avec 3 viewers différents, qu'on ouvre à partie de File / New / Tool :
- Profiling Class View : liste de toutes les classes utilisées avec le nombre de fois, et les méthodes appelées
- Profiling Routine view : profiling "traditionnel", on peut voir ne nombre de fois où on est passé sur chaque ligne de code, et les appels de fonctions associés avec le temps que ça a pris
- Profiling Trace view : la liste des évènement un peu comme /PBDEBUG, exemple de Trace view (je n'ai pas sélectionné toutes les traces possibles) :
Exemple d'utilisation depuis pbscript (dans mon appli j'ai une interface de pilotage qui ressemble à ça :
Ouverture du fichier :
timerkind timer string ls_tracefile errorreturn lerr ls_tracefile = sle_tracefile.text if ls_tracefile = "" then return if not gb_tracepending then choose case ddlb_tracetimertype.text case "Clock!"; timer = clock! case "Process!"; timer = process! case "Thread!"; timer = thread! case "TimerNone!"; timer = timernone! end choose lerr = TraceOpen(ls_tracefile, timer) if lerr <> success! then debug_message(classname() + "::cb_profilestart.clicked()", "TraceOpen failed") else gb_tracepending = true //ICI on rend possible le choix du type de trace end if end if
On choisit le type des traces qu'on veut collecter (exemple pour une checkbox qui représente un type)
if this.checked then TraceEnableActivity( ActLine! ) debug_message(classname(), "ActLine activity enabled") else TraceDisableActivity( ActLine!) debug_message(classname(), "ActLine activity disabled") end if
Lorsqu'on le désire, on démarre la collecte des traces
errorreturn lret if gb_tracepending then lret = TraceBegin("Manual Tracing block") if lret <> success! then debug_message(classname() + "::cb_profilebegin.clicked()", "TraceBegin() failed") end if
Plus tard, on arrête la collecte
errorreturn lret if gb_tracepending then lret = TraceEnd() if lret <> success! then debug_message(classname() + "::cb_profileend.clicked()", "TraceEnd() failed") end if
Et surtout, on n'oublie pas oublier de fermer le fichier de traces
if gb_tracepending then lret = traceclose() if lret <> success! then debug_message(classname() + "::cb_profilestop.clicked()", "TraceClose() failed") end if
Hors ligne
legagneur a écrit:
J'ai essayé ce que tu m'as demandé, j'obtiens un fichier avec une extension .dbg. En l'ouvrant avec un éditeur de texte, les résultats contenu ne sont pas ceux auquelles je m'attendais.
Si je fais une requette par exempleCode: pb
INSERT INTO MA_TABLE(nom,prenom) values (:nom, :prenom) using transac;Je voudrais pouvoir avoir à peu près ceci dans le fichier de trace INSERT INTO MA_TABLE(nom, prenom) values (Dupont, fabrice) using transac;
Merci
Pour tracer les opérations de la base de données, il faut que tu regardes comment activer les traces spécifique à ton driver.
Par exemple avec ODBC, il faut ajouter ceci dans la ConnectString :
ConnectOption='SQL_OPT_TRACE,SQL_OPT_TRACE_ON;SQL_OPT_TRACEFILE,traces_odbc.log'
Hors ligne
legagneur a écrit:
Je voudrais pouvoir avoir à peu près ceci dans le fichier de trace INSERT INTO MA_TABLE(nom, prenom) values (Dupont, fabrice) using transac;
Si c'est juste les opérations DB que tu veux, tu peux simplement préfixer le paramètre DBMS =... avec TRACE.
Ex : DBMS = TRACE O10 Oracle10g (10.1.0)
Hors ligne