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

Langage Delphi Discussion :

[D7] - empêcher une appli de se fermer toute seule ?


Sujet :

Langage Delphi

  1. #1
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut [D7] - empêcher une appli de se fermer toute seule ?
    Salut tous

    J'ai une appli qui communique en permanence avec des machines sur des ports com, et de manière aléatoire, l'appli se ferme d'elle même, sans aucun message d'erreur ni avertissement, alors que j'ai blindé mon code de try...except et de logs.

    Y a t'il un moyen d'empêcher l'appli de se fermer d'elle même, ou au moins de savoir où et pourquoi elle se ferme ?

    Merci
    Postes Dév : W7 SP1 / Windev 21 / Delphi 7 Entreprise
    Serveur : W2k12 SP1 + SQL 2014 RC2
    Connexion : OLE.DB

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 522
    Points : 25 052
    Points
    25 052
    Par défaut
    Malheureusement pas !
    Tu n'as aucun log (d'ailleurs, tu as blindé la fonction log aussi ?)
    Peut-être une trace dans l' Observateur d'Evènements de Window, tu as parfois des entrées pour des applications qui crash brutalement !

    Tu as vérifié la mémoire, le nombre de handle utilisé ? est-ce que ça grimpe au fil du temps ?
    Combien de temps, en moyenne, cela crash ?
    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
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Un crash comme ça, en Delphi, c'est quasiment exclusivement la faute d'une stack overflow.

    En tous cas ce sont les seuls cas dans lesquels j'ai pu observer ces symptômes.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  4. #4
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    (d'ailleurs, tu as blindé la fonction log aussi ?)
    oui, je n'ai jamais autant écrit de try...


    Citation Envoyé par ShaiLeTroll Voir le message
    Peut-être une trace dans l' Observateur d'Evènements de Window, tu as parfois des entrées pour des applications qui crash brutalement !
    Il y a des erreurs "module défaillant msvcrt.dll" et d'autres avec le nom de l'exe. Mais ça ne me parle pas.


    Citation Envoyé par ShaiLeTroll Voir le message
    Tu as vérifié la mémoire, le nombre de handle utilisé ? est-ce que ça grimpe au fil du temps ?
    Combien de temps, en moyenne, cela crash ?
    Le probléme de cette appli, c'est qu'elle ne fonctionne que chez le client, car je n'ai pas les machines à mon bureau pour reproduire l'environnement de prod.
    J'ai passé trois heures mardi sur site devant le PC, et il ne s'est rien passé. Et le prog a ensuite laché plusieurs fois pendant la nuit.
    Les opérateurs ne savent pas utiliser un ordi, alors pas question de leur demander d'aller voir les handles ou les ressources en cas de crash.


    Citation Envoyé par sjrd Voir le message
    Un crash comme ça, en Delphi, c'est quasiment exclusivement la faute d'une stack overflow.
    Et comment puis-je gérer ou empêcher ça ?

    J'ai trouvé l'outil madExcept sur le net, je vais l'intégrer à mon projet, et voir les logs qu'il génére.
    Postes Dév : W7 SP1 / Windev 21 / Delphi 7 Entreprise
    Serveur : W2k12 SP1 + SQL 2014 RC2
    Connexion : OLE.DB

  5. #5
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut
    J'ai un vague souvenir d'avoir une fois modifié un paramètre dans l'IDE pour allouer plus de mémoire à un programme de traitement de fichiers vectoriels.
    C'était en D3 sous W2K.
    Est-ce encore d'actualité sous D7 avec XP ?
    Postes Dév : W7 SP1 / Windev 21 / Delphi 7 Entreprise
    Serveur : W2k12 SP1 + SQL 2014 RC2
    Connexion : OLE.DB

  6. #6
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut
    Se pourrait-il que ce soit ma TStringlist globale qui sert pour les logs qui finisse par déborder de la pile ?
    Postes Dév : W7 SP1 / Windev 21 / Delphi 7 Entreprise
    Serveur : W2k12 SP1 + SQL 2014 RC2
    Connexion : OLE.DB

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Points : 311
    Points
    311
    Par défaut
    J'ai trouvé l'outil madExcept sur le net, je vais l'intégrer à mon projet, et voir les logs qu'il génére.
    ca peut être intéressant, autrement il y a memcheck également, moins complet mais indique clairement la mémoire non libérée.

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 522
    Points : 25 052
    Points
    25 052
    Par défaut
    euh, une TStringList c'est pas sur le tas ?

    la Pile ça serait plus des grosses variables locales genre un tableau fixe d'un bon 1Mo !

    Ou alors une récursivité (en général ça se voit assez vite),
    mais il en existe de vicieuse comme dans ce sujet Les exceptions feraient des fuites mémoire?

    tu n'appelle pas Application.ProcessMessages dans un Timer, et ainsi les appeles à la méthode Timer s'empile ?
    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

  9. #9
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    euh, une TStringList c'est pas sur le tas ?

    la Pile ça serait plus des grosses variables locales genre un tableau fixe d'un bon 1Mo !

    Ou alors une récursivité (en général ça se voit assez vite),
    mais il en existe de vicieuse comme dans ce sujet Les exceptions feraient des fuites mémoire?

    tu n'appelle pas Application.ProcessMessages dans un Timer, et ainsi les appeles à la méthode Timer s'empile ?
    Je n'ai pas de tableau dans le prog.
    La seule variable globale susceptible de contenir bcp de data, c'est la striglist des logs. Les autres sont des entiers qui changent rarement de valeur, et il n'y en a qu'une dizaine.

    Je n'ai pas non plus d'application.processmessages nulle part.
    Mais l'appli utilise pas mal de timers en effet.

    il y en a un qui interroge une machine tous les 1/10 de sec.
    un autre qui surveille les réponses emises de la machine en asynchrone, toutes les millisecondes (déclenché uniquement si une réponse est attendue)
    un autre qui surveille qu'un dialogue ne tourne pas en rond, et le relance si nécessaire (toutes les 4 sec.)

    et il y en a d'autres pour une autre machine, mais bcp moins sollicitée.
    Postes Dév : W7 SP1 / Windev 21 / Delphi 7 Entreprise
    Serveur : W2k12 SP1 + SQL 2014 RC2
    Connexion : OLE.DB

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 522
    Points : 25 052
    Points
    25 052
    Par défaut
    Pourquoi une TStringList pour tes Logs ?
    Tu devrais écrire dans un fichier texte directement, ou table de la base (si le bug ne vient pas de la base évidemment), ou encore Trace ETW
    Inutile de laisser ça stocker en mémoire !

    Tu peux aussi mettre des Niveaux à tes traces comme Debug, Hint, Warning, Error.
    Tu n'actives l'écrire dans un fichier qu'à partir d'un certain niveau défini par un fichier de config

    Error en prod
    Warning lors d'une prod défectueuse que tu souhaites surveiller
    Hint\Debug durant le Dev

    Pour ce genre de chose, j'utilise des Threads (tant qu'il n'y a pas de visuel et que du traitement, c'est mieux)

    Rien qu'afficher un PopupMenu ou un ShowModal, ça peut avoir un impact sur le comportement des TTimer !

    Sinon c'est quoi ton histoire de "Dialogue en boucle" ?
    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

  11. #11
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Pourquoi une TStringList pour tes Logs ?
    Tu devrais écrire dans un fichier texte directement, ou table de la base (si le bug ne vient pas de la base évidemment), ou encore Trace ETW
    Inutile de laisser ça stocker en mémoire !
    Parce que le débit est tellement important, genre 1 log toutes les 2-3 ms, que l'accès mémoire me parait être ce qu'il y a de plus rapide, et que les premiers tests que j'ai effectué au début du dév avec des écritures fichiers ou bases ralentissaient l'ensemble du programme.
    J'ai quand même un nb max de ligne dans la trace pour limiter la taille totale.


    Citation Envoyé par ShaiLeTroll Voir le message
    Tu peux aussi mettre des Niveaux à tes traces comme Debug, Hint, Warning, Error.
    Tu n'actives l'écrire dans un fichier qu'à partir d'un certain niveau défini par un fichier de config

    Error en prod
    Warning lors d'une prod défectueuse que tu souhaites surveiller
    Hint\Debug durant le Dev
    C'est déjà en place, mais avec tous les pbm actuels, je n'ai pas d'autre choix que d'activer toutes les traces possibles, et ça fait du monde.

    Pour les threads, je n'ai jamais pratiqué, et ça ma parait être un trop gros truc à mettre en place dans l'état actuel du prog, j'ai peur d'avoir encore plus de points à régler qu'à l'heure actuelle.


    Citation Envoyé par ShaiLeTroll Voir le message
    Rien qu'afficher un PopupMenu ou un ShowModal, ça peut avoir un impact sur le comportement des TTimer !
    Oui, je m'en suis rendu compte, et ça fait partie dse pbm à résoudre, mais je ne vois pas bien comment.
    Si la fenêtre principale perd le focus trop logntemps, les timers s'arrêtent, et du coup l'appli ne fait plus rien et les communications avec les machines sont coupées.


    Citation Envoyé par ShaiLeTroll Voir le message
    Sinon c'est quoi ton histoire de "Dialogue en boucle" ?
    Un dialogue avec une machine passe par 4 ou 5 étapes de question/réponse, les étapes sont regroupées en phases (demande d'état, demande de poids...)
    Si une phase dure trop longtemps (plus de 600ms), c'est qu'une étape de dialogue ne s'est pas terminée proprement, donc je relance tout le dialogue de la phase depuis le début.


    Sinon, j'en suis venu à me demander si effectivement je n'ai pas une recursivité infinie qqpart.
    Faut que je réétudie les appels au traitement principal.
    Postes Dév : W7 SP1 / Windev 21 / Delphi 7 Entreprise
    Serveur : W2k12 SP1 + SQL 2014 RC2
    Connexion : OLE.DB

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 522
    Points : 25 052
    Points
    25 052
    Par défaut
    Citation Envoyé par fredfred Voir le message
    débit est tellement important, genre 1 log toutes les 2-3 ms...
    C'est un bon volume, j'ai déjà eu des applis très gourmande en log aussi, je confirme, cela ralenti, j'avais plafonné à 10000 lignes dans un TRichEdit (avec de la couleur) qui afficher le debug, idem, en quelques minutes, c'était plein !
    Mes logs étaient en DB, je devais bien logger 50 à 100 messages par secondes, un débit tout à fait ordinaire pour des batch critique !
    Citation Envoyé par fredfred Voir le message
    Pour les threads, je n'ai jamais pratiqué, et ça ma parait être un trop gros truc à mettre en place dans l'état actuel du prog, j'ai peur d'avoir encore plus de points à régler qu'à l'heure actuelle.
    Faut pas avoir Peur !

    Citation Envoyé par fredfred Voir le message
    Si la fenêtre principale perd le focus trop logntemps, les timers s'arrêtent, et du coup l'appli ne fait plus rien et les communications avec les machines sont coupées.
    Thread !
    Le mieux étant d'avoir une application server, autonome, sans fenêtre, qui se met dans les NotifyIcon et une application cliente qui permet de configurer et d'afficher des infos (communication par message ou TCP\IP, cela permet de déporter le client sur une autre machine)

    Tu as un protocole tout à fait normal avec ACQ\NAK\TimeOut, c'est la bonne méthode !

    Bonne Fouille !
    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

  13. #13
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut
    Je viens de remplacer tous les appels directs à la procédure de traitement principal par un déclenchement de timer (un de plus). Celui appelle la procédure principale au bout de 2 ms. Cela devrait permettre de couper court à toute récursivité.

    Je test en prod demain toute la journée. On verra ce que ça donne.

    Sinon, le coup de faire une appli client-serveur est une bonne idée.
    J'y songerai sérieusement si je ne m'en sors pas avec le code actuel.

    Concernant les logs, le TString de 5000 lignes plein à craquer sauvé dans un fichier fait 250K max.
    Postes Dév : W7 SP1 / Windev 21 / Delphi 7 Entreprise
    Serveur : W2k12 SP1 + SQL 2014 RC2
    Connexion : OLE.DB

Discussions similaires

  1. Une requête qui s'exécute toute seule
    Par Rymaya dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 28/11/2011, 14h55
  2. Réponses: 13
    Dernier message: 11/06/2010, 23h21
  3. [VBA-EXCEL]--Empêcher une fenêtre de se fermer
    Par gantec dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/04/2007, 11h17
  4. Réponses: 3
    Dernier message: 26/05/2006, 17h35
  5. [VB6] Quitter l'appli et fermer toutes les feuilles...
    Par The Bob dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/06/2003, 21h06

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