Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1758 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Exception code in C ???

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Exception code in C ???

n°2071907
Noobs69
Posté le 25-04-2011 à 18:12:10  profilanswer
 

Bonjour,
 
Toujours dans ma découverte du C, je recherche une capture des erreurs de code, pour transmettre quelques infos à stderr avant la fin du monde (enfin juste avant le crash de l'appli, ça suffira).
 
J'ai bien tout lu setjump.h et ucontext.h et j'avoue être un peu perplexe.
 
Quelqu'un aurait-il un code d'exemple ?
 
Je cherche à implémenter un code d'exception qui soit un passage obligé du programme avant sa sortie pour imprimer des choses simples, genre la ligne de plantage, la fonction en cours, ce qui sera toujours mieux que "exception fault" sans repères.
 
Je compile sous cygwin pour i686 et qu'en C, pas en C++.
 
Merci pour votre aide.

mood
Publicité
Posté le 25-04-2011 à 18:12:10  profilanswer
 

n°2071910
regexp42
Eplucheur de RFC.
Posté le 25-04-2011 à 18:38:15  profilanswer
 

Il n'y a pas d'exceptions en C.
 
Pour ce qui est setjump et compagnie c'est pas vraiment ce que tu veux, surtout si tu commences.
 
En C on gère les erreurs en retournant des valeurs.

n°2071927
Noobs69
Posté le 25-04-2011 à 21:08:35  profilanswer
 

Même avec un ASM en tête de main pour contrôler la chute, il n'y a rien ?  
Ca m'étonne que personne n'ait approché le problème et donc mis un contournement en place ?!
 
Je débute en C, pas en prog, donc même si vous avez des exemples qui font peur, je prend.
 
Sinon, comment contrôles-tu, regexp42, un "exception fault" ?
Tu te le manges et c'est tout ?
Bof, je pense qu'on peut mieux faire et que certains ont trouvé.


Message édité par Noobs69 le 25-04-2011 à 21:10:40
n°2071942
gilou
Modérateur
Modzilla
Posté le 25-04-2011 à 22:13:29  profilanswer
 

1) Si tu es sous Unix/Linux (sous windows, laisse tomber, vu comment l'émulation de signal marche)
2) Si tu as du temps à perdre
Tu peux t'inspirer des techniques explicitées ici: http://www.smartango.com/articles/ [...] n-handling
Mais à la base, le langage C n'est pas fait pour cela, si tu ne veux pas d'exception fault, tu écris du code clean qui n'en génère pas (et c'est la l'art d'un bon programmeur C, de savoir gérer les accès mémoire avec précaution).
A+,


Message édité par gilou le 25-04-2011 à 22:15:57

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2071947
Noobs69
Posté le 25-04-2011 à 22:52:54  profilanswer
 

Mais bien sur et l'erreur n'est pas humaine !!
 
Je compte en moyenne 10-15mn de test par ligne de code sur des prog indus de 15 à 35000 lignes dans des langages simples à boucles de contrôles minimales et bordées (Automates, superviseurs, labview, etc ...).
 
Il y aura toujours des erreurs, tant que personne n'aura inventé le contrôle automatique du génie logiciel, un peu un saint Graal inaccessible.
Donc, en attendant, je préfère "perdre du temps", bien que je pense en gagner à la fin sans revenir sans cesse à la construction de la roue pour des erreurs de bases.
 
Plus je saurai d'où vient une erreur fortuite, plus rapide sera la résolution.
 
 
Et je suis sous Linux, pas sous Windows, je ne suis pas fou.

Message cité 3 fois
Message édité par Noobs69 le 25-04-2011 à 22:53:22
n°2071959
gilou
Modérateur
Modzilla
Posté le 26-04-2011 à 00:22:13  profilanswer
 

Mais ça n'a rien à voir avec la folie! Je ne vois pas ce qu'une telle réflexion vient faire ici.
 
C'est tout a fait possible sous windows, c'est même un mécanisme très robuste, le Structured Exception Handling, ou SEH, et ça existe depuis 10 bonnes années au moins. Simplement, il faut utiliser des extensions spécifiques au compilateur, et les techniques à utiliser sont différentes de celles sous linux.
 
Quand à l'erreur humaine, en ce qui concerne le C, si on parle de programmeurs expérimentés avec 10 années de programmation C ou plus, c'est principalement dans l'utilisation de fonctions dont le comportement est mal documenté que les erreurs vont survenir.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2071967
theshockwa​ve
I work at a firm named Koslow
Posté le 26-04-2011 à 03:58:56  profilanswer
 


Personne ne t'interdit de faire du B ou du Z avant de faire ton programme en C


---------------
last.fm
n°2071996
gilou
Modérateur
Modzilla
Posté le 26-04-2011 à 11:08:58  profilanswer
 

Noobs69 a écrit :

Plus je saurai d'où vient une erreur fortuite, plus rapide sera la résolution.

Sous linux, s'il y a génération d'un core dump, une étude de la pile d'appel donne un maximum d'information en général.  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2072009
Noobs69
Posté le 26-04-2011 à 11:36:37  profilanswer
 

Du concret s'il vous plait messieurs.
 
Du core dump, très bien, mais sur quelle base, quelle bibliothèque, quel mécanisme ? Il faut paramétrer le makefile différemment en gcc sous cygwin pour obtenir un code de sortie additionnel ?
 
Que vous faut-il comme informations pour m'aiguiller concrètement ?

n°2072021
gilou
Modérateur
Modzilla
Posté le 26-04-2011 à 12:46:11  profilanswer
 

Le mécanisme est automatique depuis les premiers Unix. Si un programme qui plante ne génère pas un core dump, c'est parce que le système a été configuré pour l’empêcher, avec un "ulimit -c 0" dans un scripts de boot par exemple. Il suffit de réactiver la génération des core dumps en faisant "ulimit -c unlimited".
Et sur un core généré, il suffit de lancer gdb. Voir par exemple ici: http://cs.baylor.edu/~donahoo/tools/gdb/tutorial.html
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le 26-04-2011 à 12:46:11  profilanswer
 

n°2072030
Noobs69
Posté le 26-04-2011 à 13:24:32  profilanswer
 

Donc sur un Samsung Arm 920T et son noyau propriétaire, je n'ai pas de solution car ils ont déjà limité pas mal de choses en empêchant l'accès au framebuffer et il faut contourner pour y arriver, l'accès aux fonctions shutdown, etc ...
Une idée pour arriver à générer des core dumps ?

n°2072033
Un Program​meur
Posté le 26-04-2011 à 13:46:40  profilanswer
 

Noobs69 a écrit :


Je compile sous cygwin pour i686 et qu'en C, pas en C++.


 

Noobs69 a écrit :

Et je suis sous Linux, pas sous Windows, je ne suis pas fou.


 
Faudrait savoir.
 
En supposant que le deuxième message est correct, sous Unix un programme se termine de trois manières:
 
- en exécutant exit (y compris le retour de main()) -> tu enregistres qqch avec atexit.
 
- en exécutant _Exit/_exit -> tu peux rien faire
 
- en recevant un signal.  La plupart permettent l'instantallation d'un gestionnaire, voir signal et sigaction.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2072035
Noobs69
Posté le 26-04-2011 à 14:10:17  profilanswer
 

Je compile sous Windows car dans bon nombre de sociétés les environnement d'entreprise sont sous Windows, lobbying oblige, et pour développer nous n'avons d'autres choix que d'émuler un environnement linux.
 
Oui je n'aime pas windows car nous avons trop galéré en mise à jour d'applications suite aux évolutions des OS et des services packs jamais bien contrôlés et pas suffisamment d'information vers les SSII, même en prenant tous les partenariats possibles.
 
Alors nous avons abandonné les WinCE et compagnie pour venir sur des systèmes embarqués sous linux.
 
Ne chercher pas de polémiques inutiles, ça n'aide en rien ma problématique, et je trouve déplacé de venir me justifier de mes commentaires pour avoir le droit de glaner de votre part des informations que je ne maitrise pas encore.
Les connaissances que vous avez ne vous positionne en aucune manière en un juge de mes remarques et soit vous êtes ici pour aider, auquel cas, nous continuons à dialoguer, ou sinon, j'attendrai qu'un aidant pragmatique veuille bien me répondre.
 
Donc, pour en revenir à vos infos :
- atexit ne m'aidera pas à trapper un "exception fault", si je comprend bien son fonctionnement.
- _Exit, effectivement, j'avais déjà essayé.
- reste le signal 11 pour "exception fault" que je ne sais pas trapper, même après avoir lu et vu des exemples.
 
Comment puis-je faire ?

n°2072039
theshockwa​ve
I work at a firm named Koslow
Posté le 26-04-2011 à 14:29:46  profilanswer
 

Noobs69 a écrit :

Ne chercher pas de polémiques inutiles, ça n'aide en rien ma problématique, et je trouve déplacé de venir me justifier de mes commentaires


C'est toi qui parle de lobbying sans autre argumentaire, qui parle d'être fou pour être sous windows alors que la plupart d'entre nous s'en trouvent très satisfaits, la polémique, c'est avec tes piques régulières que tu la lances, et ce ne sont pas les autres intervenants ici. Eux te demandaient juste sous quel environnement tu travaille. Fin de la paranthèse.
 
Edit : pour apporter ma pierre à l'édifice, pour les MFC, Microsoft (oui, justement) proposait une solution de gestion d'exceptions à base de macros en C, je crois qu'on peut retrouver une lib similaire, mais évidemment, ca ne fait pas de miracle. le système lui-même n'en lève pas parce que ce n'est pas standardisé.


Message édité par theshockwave le 26-04-2011 à 14:33:44

---------------
last.fm
n°2072042
Noobs69
Posté le 26-04-2011 à 14:39:27  profilanswer
 

Une idée du nom de la lib, d'une description ?

n°2072044
theshockwa​ve
I work at a firm named Koslow
Posté le 26-04-2011 à 15:00:38  profilanswer
 

En cherchant un peu grâce à notre ami commun google, on trouve pas mal de tentatives de proposer des exceptions en C, mais globalement, on voit les solutions se diviser en deux catégories au moins :
- D'une part, des implémentations à base de variables globales d'état (le throw modifie cet état, le catch le vérifie) qui pose quelques soucis si jamais tu fais du multi thread (à moins que tu aies un mécanisme pour passer ce contexte en thread local storage, mais c'était absent de s implémentations que j'ai croisées à l'instant)
- D'autre part, des implémentations qui reposent sur les setjmp/longjmp qui peuvent être intéressantes à essayer, comme par exemple ce qui est décrit ici
 
Cela dit, tu noteras que, dans tous les cas, le système ne t'enverra pas lui-même d'exception. Ce sera à toi de tester les codes d'erreurs et de lever manuellement l'exception, que ce soit pour tes appels systèmes ou pour tes appels à d'éventuels bibliothèques externes.
 
Après, si ca te suffit de ne plus devoir t'inquiéter que des bordures de ton application, ces solutions peuvent peut-être te convenir.


---------------
last.fm
n°2072045
gilou
Modérateur
Modzilla
Posté le 26-04-2011 à 15:01:15  profilanswer
 

Noobs69 a écrit :

Donc sur un Samsung Arm 920T et son noyau propriétaire, je n'ai pas de solution car ils ont déjà limité pas mal de choses en empêchant l'accès au framebuffer et il faut contourner pour y arriver, l'accès aux fonctions shutdown, etc ...
Une idée pour arriver à générer des core dumps ?

C'est sur que l'on pouvait deviner que ton problème concernait de l'embarqué, qui a des contraintes spécifiques (pas de core, vu qu'il y a pas d'espace de stockage pour ça à priori). J'avais probablement pas bien nettoyé ma boule de cristal.
Il te faut l'avis d'un spécialiste de l'embarqué, et tu devrais faire figurer cela dans le titre de ton topic.
Comme tu utilises gcc, tu peux utiliser la fonction spécifique backtrace() et la technique décrite par le 3e intervenant ici (l'article qu'il donne en lien est a lire aussi) http://stackoverflow.com/questions [...] pp-crashes
Mais bon, si tu compiles sous windows, en émulant linux, pour une plateforme embarquée, il y a fort a parier que l'émulation des signaux soit loin d'être parfaite, et donc rien ne garantit que les techniques indiquées marchent. Rien que pour l'émulation d'un trap de SIGUSR, avec un programme de 20 lignes en mode console DOS compilé sous digital mars, il y a des comportements aléatoires sous windows, alors...
A+,

 

Message cité 1 fois
Message édité par gilou le 26-04-2011 à 15:09:09

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2072049
Noobs69
Posté le 26-04-2011 à 15:52:23  profilanswer
 

Merci, donc préférable de monter une machine en ubuntu ou autre ?
 
Comment se garantir de la production possible ou non des signaux ?

n°2072054
theshockwa​ve
I work at a firm named Koslow
Posté le 26-04-2011 à 16:08:58  profilanswer
 

gilou a écrit :

C'est sur que l'on pouvait deviner que ton problème concernait de l'embarqué, qui a des contraintes spécifiques (pas de core, vu qu'il y a pas d'espace de stockage pour ça à priori). J'avais probablement pas bien nettoyé ma boule de cristal.
Il te faut l'avis d'un spécialiste de l'embarqué, et tu devrais faire figurer cela dans le titre de ton topic.
Comme tu utilises gcc, tu peux utiliser la fonction spécifique backtrace() et la technique décrite par le 3e intervenant ici (l'article qu'il donne en lien est a lire aussi) http://stackoverflow.com/questions [...] pp-crashes
Mais bon, si tu compiles sous windows, en émulant linux, pour une plateforme embarquée, il y a fort a parier que l'émulation des signaux soit loin d'être parfaite, et donc rien ne garantit que les techniques indiquées marchent. Rien que pour l'émulation d'un trap de SIGUSR, avec un programme de 20 lignes en mode console DOS compilé sous digital mars, il y a des comportements aléatoires sous windows, alors...
A+,

 


 

S'il est simplement sous cygwin pour faire du cross compiling, c'est pas gênant de reposer sur des signaux, tant qu'il n'attend pas que son programme soit portable sous windows.

 
Noobs69 a écrit :

Merci, donc préférable de monter une machine en ubuntu ou autre ?

 

Comment se garantir de la production possible ou non des signaux ?

 

Comme je le dis juste au-dessus, ca dépend de ce que tu fais de ton programme, c'est pas nécessaire d'avoir une machine proche de l'environnement d'exécution pour développer sur de l'embarqué, fort heureusement.


Message édité par theshockwave le 26-04-2011 à 16:10:34

---------------
last.fm

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Exception code in C ???

 

Sujets relatifs
[C] pointeurs de pointeurs [RESOLU]comment utiliser la bibliothèque Faxcom ? VBA & C++
Code C-Lecture de fichiers à partir d'un dossier.Visual C++ dependances supplémentaires
Creation d'une appli Web a partir du code C# WinformsDebugage jeu en C#
en C : comment retourner plusieurs variables ?Transformer ma fonction Recherche en code
Plus de sujets relatifs à : Exception code in C ???


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR