Programme en pas à pas OK mais sinon arret

aurhas Messages postés 16 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 juin 2010 - 18 mai 2010 à 12:49
aurhas Messages postés 16 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 juin 2010 - 18 mai 2010 à 16:28
Bonjour,
je fais un programme à partir de bouts de codes que j'ai trouvés. Ce programme lis des données qui arrivent sur l'USB, les formate et les affiche dans une fenetre que je fais avec GTK+. La fonction de lecture est appelée périodiquement (g_timeout_add).
Mon problème est que ca plante quand je le lance normalement : program.exe a cessé de fonctionner. Quand je fais en débug sans point d'arrêt ca me donne : Program received signal SIGSEGV, Segmentation fault et les lignes correspondantes sont toujours les mêmes :
save = *(p + data_offset + 2 * pMsg->len );
// autre code
*(p + data_offset + 2 * pMsg->len ) = save;

Cependant, quand je fais presque ligne par ligne, cela fonctionne bien.
Avez-vous une idée d'où ca peut venir ? A quoi sont dues en général ces erreurs ? est-il possible de remplacer ces lignes par autre chose de plus simple ? faut-il mettre des tempos ?
Merci d'avance de vos réponses

6 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
18 mai 2010 à 13:54
Non, c'est juste un coup de chance que ça fonctionne en pas à pas.
Tu as du faire une erreur de mémoire (tu doit faire un débordement, ou écrire dans une zone non allouée ou déjà supprimée).

Aucun "tempo" n'est nécessaire, tu dois juste corriger ton code défectueux.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
aurhas Messages postés 16 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 juin 2010
18 mai 2010 à 14:10
Merci de votre réponse.
J'ai changé des lignes de cette fonction qui me pose problème. en fait entre les 2 lignes que j'ai écrites précédemment, il y a :
if ( !( pMsg->flags & CANMSG_RTR ) ) {
    for ( i= MIN( pMsg->len, 8); i > 0; i-- ) {
      *(p + data_offset + 2 * (i-1) + 2 )= 0;
      sscanf( p + data_offset + 2 * (i-1), "%x", &val );
      pMsg->data[ i - 1 ] = val;
    }
  }

en fait je range, dans le champs data de pMsg (qui est un pointeur qu'on passe à cette fonction et dont le type est CANMsg), les données hexadécimales contenues dans p (qui est un pointeur vers la donnée que je reçois sur l'USB) (l'offset est de 5).
Quand j'enlève uniquement les lignes précédentes, j'ai une erreur identique sur la ligne
*(p + data_offset + 2 * (i-1) + 2 )= 0;

Quand j'enlève les lignes qui me posaient problème tout à l'heure ainsi que la ligne *(p + data_offset + 2 * (i-1) + 2 )= 0;, j'ai une erreur semblable (en debug) mais liée à la fonction sscanf... je suppose que cela veut dire que l'adresse "p + data_offset + 2 * (i-1)" est incorrecte mais je ne comprends pas pourquoi. la donnée vers laquelle pointe p ressemble à "t140300451C3709\r". dans lequel len est le 5ème caractère.
le pointeur pointe vers une donnée disponible d'après ces lignes... ou pas ?
est-il possible d'écrire autrement les lignes qui posent problème ?
Merci d'avance.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
18 mai 2010 à 14:24
*(p + data_offset + 2 * (i-1) + 2 )= 0


Tu dois te poser plusieurs questions:
- Est-ce que la zone à l'adresse: p + data_offset + 2 * (i-1) + 2, est disponible ?
ou
- Est-ce que la zone à l'adresse: p + data_offset + 2 * (i-1) + 2 est alloué ?

Pour vérifier les erreurs mémoires, tu as un outil très pratique qui s'appelle "valgrind" (sous Linux, sous Windows il me semble que "purify" le fait aussi).

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
aurhas Messages postés 16 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 juin 2010
18 mai 2010 à 16:02
merci encore.
je ne suis pas expert en c mais je pense que la zone pointée est disponible et allouée.
ca peut sembler bizarre, mais j'ai réussi à contourner le probleme.... avec des tempos.
du coup, mon programme est très lent mais fonctionne...
une idée du probleme ??
merci encore de votre aide.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
18 mai 2010 à 16:04
Ton programme, est-il multi-threadé ?

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
aurhas Messages postés 16 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 juin 2010
18 mai 2010 à 16:28
je ne sais pas le faire donc non sauf si je l'ai fait sans le vouloir...
0
Rejoignez-nous