IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Usage de WaitForDebugEvent


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre régulier
    Développeur informatique
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Par défaut Usage de WaitForDebugEvent
    Bonjour à tous le monde,
    dans un grand nombre de mes programme j'utilise la fonction OutputDebugString. Et ceci de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure MyOutputDebugString(v: integer);
    begin
      if (v > 0) then OutputDebugString(PChar(FAppAlias + '>' + IntToStr(Abs(v))))
      else OutputDebugString(PChar(FAppAlias + '<' + IntToStr(Abs(v))));
    end;
    En utilisant DebugView j'obtient bien le résultat attendu.
    Mais, dans chacune de mes applications, ou service, j'ai également insérer un code faisant office de moniteur d'entrée et de sortie des méthodes (cf. image ci-jointe) qui est codé comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure Mon(v: integer);
    begin
    {$IFDEF LEDMON}
     LedMon.SetLed(v);
    {$ENDIF}
     
    {$IFDEF DBGMON}
     DbgMon.MyOutputDebugString(v);
    {$ENDIF}
    end;
    Or ce code pèse, quelque peu, sur les performances de mes applications et demande à être maintenu, alors même que l'application ne requiert plus de maintenance. Pour éviter ces problèmes, je souhaiterais pouvoir récupérer et traiter (d'après un formatage spécifique) les chaines émise par la méthode " OutputDebugString ".

    Après quelques recherche sur le MSDN, j'ai découvert la fonction " WaitForDebugEvent ". Je tente donc d'utiliser celle-ci pour récupérer les chaines émises lors des événements de type " OUTPUT_DEBUG_STRING_EVENT " (Cf. fichier " UChild.pas " ci-joint).

    Bon jusque là je pense que je ne suis pas trop faux dans ma démarche (enfin j'espère). Hélas, trois fois hélas, cela ne semble par marcher. Pire encore, lorsque cela veut bien marcher et après fermeture de mon application de " debug " le processus l'application observer est détruit...

    Donc, l'objet de ma demande consiste à savoir si une main secourable pourrais m'aiguiller quelque peu afin de trouver la " bonne " méthode.

    Cordialement,
    Dominique.
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    Normallement OutputDebugString ne fonctionne que si l'application est lancé en débugage, voir IsDebuggerPresent ...

    tu pourrais dans ton MyOutputDebugString, vérifie une variable (initializé lors de la première consultation avec IsDebuggerPresent, tu mettre ça dans une méthode de classe ...)

    ainsi, au lieu de de faire OutputDebugString, tu remplace cela par un SendMessage WM_COPYDATA ou un autre message, on peut envoyer des chaines sans problèmes tant que l'on ne fait que les lire via wParam et lParam, et bien sur très facilement des entiers, (attention, il faut récupérer la chaine, et la stocker dans une fifo pour traitement ultérieure car SendMessage attent que le receveur aie fini son traitement pour continuer l'execution de l'emetteur), ainsi dans ton programme, tu ajoute une sorte d'accroche, une fonction exporté façon DLL ou un SendMessage pour envoyer à l'application à debugger le handle de l'application de surveillance à qui envoyer les chaines de débug ... sinon Socket, ... mais c'est déjà plus lourd ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    procedure TDebugger.Activate(var Msg: TMessage); // message UM_ACTIVE_DEBUG // dans interface
    begin
      FHandleReceiver := Msg.wParam;
      FActivated := LongBool(Msg.lParam) and (FHandleReceiver > 32);
    end;
     
    function TDebugger.RunInDebbuger(): Boolean;
    begin
      if FRunInDebbugerReaded then
        Result := FRunInDebbuger
      else
      begin
        // Plein de Code, avec IsDebuggerPresent, ou System.DebugHook
        // _IsDebuggerPresent => LoadLibrary et GetProcAddress
        FRunInDebbugerReaded := True;
        FRunInDebbuger := _IsDebuggerPresent();
      end;
    end;
     
    procedure TDebugger.OutputDebugString(const S: string);
    begin
      if RunInDebbuger() then
      begin
        if S <> '' then
          SendMessage(FHandleReceiver, UM_ODS, Cardinal(@S[1]), 0);
      end
      else
      begin
        OutputDebugString(PChar(S));
      end;
    end;
    PS : ton appli de debug à l'air sympa, ça me fait penser aux outils de debug d'un programme machine trieuse avec lequel je communicais quand je faisais presque de la programmation industrielle ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier
    Développeur informatique
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Par défaut Usage de WaitForDebugEvent
    Merci ShaiLeTroll pour réponse on ne peut plus rapide...

    Hélas ta solution, certes plaisante, ne me semble pas convenir. La fonction " IsDebuggerPresent " est uniquement valable dans le cas ou l'on exécute le programme depuis un débogueur tels que, par exemple, Delphi. En outre ses trames sont débrayable via un fichier INI.

    Qui plus est, vue la masse de message émis, pour ton information un log de DebugView pour une période de 24h peut peser plusieurs Go, j'ai un peu peur que cela n'impacte trop fortement les performances du système. Tant par la quantité émise que par la quantité à traiter. Il est important, pour moi, d'impacter le moins possible le fonctionnement habituel du système ainsi que celui de mes applications, services et librairies.

    En fait " OutputDebugString " est une fonction idéal pour ce que je souhaite faire. Dans le cas ou l'on débugge via Delphi elle est intercepter par le débogueur. Sinon un outil, tels que DebugView, me permet de suivre l'ensemble des " trames de débogage " émise par les applications, services et librairies.

    Delors l'implémentation d'une application complémentaire et autonome, afin d'externaliser le monitoring des applications et services, prend tout son sens. C'est pour cela que l'utilisation de " WaitForDebugEvent " me semblais " logique ".

    Cordialement,
    Dominique.

    P.S.: Pour ce qui concerne le monitoring, c'est du " home made ". L'idée est venue suite à l'observation des émulateurs CPU des mes collègue " hardeux ". Pour la réalisation c'est un collgue qui s'en est charger, je ne fait qu'utiliser sa bibliothèque de fonction (ou plutôt réutiliser son code).

Discussions similaires

  1. Quel usage faites vous de Python (2004 - 2008) ?
    Par Guigui_ dans le forum Général Python
    Réponses: 130
    Dernier message: 03/12/2008, 23h59
  2. [POI] Usage à partir d'une Servlet
    Par fredmorvant29 dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 19/07/2004, 15h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo