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

Visual C++ Discussion :

Récupération des erreurs d'une appli console win32


Sujet :

Visual C++

  1. #1
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut Récupération des erreurs d'une appli console win32
    Salut à tous

    Je travaille sur un grosse application console win32 qui de temps en temps plante pour des raisons non encore définie. J'aimerais savoir s'il est possible de récupérer les erreur quelque part. Ceci afin d'informer l'utilisateur que ça a planté et éventuellement savoir pourquoi.

    Pour test j'ai écrit ce tout petit bout de code qui provoque une erreur.

    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
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	printf_s("Cette application plante et c'est normal");
    	double x = 3.1416e-3;
    	double y = 5;
    	double *p=NULL;//permet de générer une erreur
     
    	for (int n = 0; n < 10; n++)
    	{
    		*p= x / y;		
    		y -= 1;
    	}
    	return 0;
    }
    • Quand je le lance sous visual studio il me met un message comme quoi j'ai un pointeur null.
    • Si je le lance dans une fenêtre invite de commande. Je n'ai pas de retour. Windows me génère juste une fenêtre qui indique que mon application à planter et que windows recherche une solution.
    • Si je fais exécuter cette application via une application en java (mode de fonctionnement normal pour l'application réelle) je n'ai aucun retour.

    Quelqu'un aurait il une idée?
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu dois pouvoir faire ça avec du Structured Exception Handling, en mettant un log dans ton Exception Filter:
    Code C : 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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    int MyExceptionFilter(DWORD exceptionCode, LPEXCEPTION_POINTERS exceptionPointers)
    {
    	fprintf(stderr, "SEH exception of type %08lX! Terminating.\n", exceptionCode);
    	FILE * logFile = fopen("logfile.txt", "a");
    	if(logFile != NULL)
    	{
    		fprintf(logFile, "SEH exception of type %08lX! Terminating.\n", exceptionCode);
    		switch(exceptionCode)
    		{
    		case EXCEPTION_ACCESS_VIOLATION:
    			/*Logguer les infos supplémentaires dans exceptionPointers*/
    			break;
    		}
    		fclose(logFile);
    	}
    	return EXCEPTION_CONTINUE_SEARCH;
    }
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	__try
    	{
    		printf_s("Cette application plante et c'est normal");
    		double x = 3.1416e-3;
    		double y = 5;
    		double *p=NULL;//permet de générer une erreur
     
    		for (int n = 0; n < 10; n++)
    		{
    			*p= x / y;		
    			y -= 1;
    		}
    		return 0;
    	}
    	__except(MyExceptionFilter(GetExceptionCode(), GetExceptionInformation())
    	{
    		return GetExceptionCode(); /*Ne sera pas exécuté de toute façon*/
    	}
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Bonne idée mais je crains de ne pas pouvoir l'appliquer dans ma grosse application car il faudrait que je mette des __try/ __except un peu partout.
    Sinon j'ai pensé à un système du type chien de garde.
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Note que le code que j'ai posté ne permet pas de "récupérer" l'erreur, mais d'informer l'utilisateur quand le programme plante.
    Il ne convient pas de considérer une Access Violation comme une erreur "récupérable" si on ne l'a pas provoquée sciemment dans des conditions contrôlées.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Là, je vais encore faire mon ayatollah, désolé Médinoc.

    On ne catch pas une exception qu'on ne traite pas (logguer n'est pas traite).

    Votre application console n'est pas l'application frontale de l'utilisateur, ça serait mal venu qu'elle affiche des messages d'erreurs hors du contexte d'utilisation de l'utilisateur final. En bref, c'est plus à l'application JAVA de se démerder pour expliquer à son utilisateur que votre application console est partie en sucette (et elle peut avoir des roues de secours, elle).

    L'approche que je vous conseille et que vous semblez envisager, c'est celle des WatchDog.

    Pour avoir un système sympa, je vous conseillerai d'utiliser des outils comme ADPlus qui permettent d'automatiser la configuration et la génération de fichier de dump en cas de crash d'une application.

    L'application JAVA lance le WatchDog et communique avec celui-ci.
    Le WatchDog lance votre application console en ayant configuré DrWatson / ADPlus pour avoir un dump en cas de crash.
    Le WatchDog peut relancer l'application console ou répondre à l'application JAVA avec le code d'erreur qui va bien.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    EXCEPTION_CONTINUE_SEARCH signifie que je ne la catche pas.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Votre application console n'est pas l'application frontale de l'utilisateur, ça serait mal venu qu'elle affiche des messages d'erreurs hors du contexte d'utilisation de l'utilisateur final. En bref, c'est plus à l'application JAVA de se démerder pour expliquer à son utilisateur que votre application console est partie en sucette (et elle peut avoir des roues de secours, elle).
    Oui c'est tout à fait ça. L'application console réalise des calculs qui peuvent être très long et ce qui pose problème à l'utilisateur c'est que parfois dans le cas ou l'application plante il ne le sait pas. Normalement il y a un suivit de la progression des calculs mais il peut être lent. Si je ne récupère pas l'erreur ce n'est pas vraiment un problème. Il faut juste que je mette un message "L'application a planté inutile d'attendre".

    Je vais jeter un oeil à ADPlus
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    J'avais parlé de DrWatson et d'ADPlus pour générer des dump et donc faire de l'analyse de bugs "sur terrain".

    Si le problème est plus de l'ordre du feedback à l'application JAVA, j'ai du mal à comprendre pourquoi la valeur de retour de l'exécution du process ne suffit pas ?

    Le watchdog, c'est plus pour relancer automatiquement le processus qui à planté.

  9. #9
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Effectivement je n'avais pas pensé au retour d’exécution. Je pensais pouvoir avoir un message du type de celui que donne le debbuger. Certain module de cette application sont en Fortran et il retourne des messages d'erreur mais pas les parties en C++
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

Discussions similaires

  1. VB6: Récupération des meta d'une page HTML avec HTMLDocument
    Par Matounet dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 22/09/2011, 07h55
  2. Récupération des paramètres d'une requête
    Par TomPad dans le forum Access
    Réponses: 10
    Dernier message: 16/06/2005, 15h11
  3. Réponses: 4
    Dernier message: 05/05/2005, 16h34
  4. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 11h20
  5. Récupération des paramètres avec une procedure stockée
    Par samlerouge dans le forum Bases de données
    Réponses: 2
    Dernier message: 31/03/2004, 22h00

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