Segmentation en mettant en boucle 5000 fois mon algo

Signaler
Messages postés
13
Date d'inscription
jeudi 12 juillet 2007
Statut
Membre
Dernière intervention
16 février 2014
-
Messages postés
13
Date d'inscription
jeudi 12 juillet 2007
Statut
Membre
Dernière intervention
16 février 2014
-
langage C
Cygwin
Windows 2000

Bonjour à tous,

J'ai un petit problème. J'ai implémenté un algo de traitement d'image qui semble marcher. Afin de tester sa robustesse, dans mon main j'ai bouclé 100 fois, 1000 fois, 2000 fois, 3000 fois, 4000 fois sur mon algo sans qu'il plante. En le lançant 5000 fois il plante. J'ai soupçonné une fuite mémoire mais il semblerait que ce ne soit pas le cas. J'ai vérifié avec un code fourni à cette adresse :

http://www.cppfrance.com/codes/SUREVEILLER-ALLOCATIONS-MEMOIRE_32481.aspx

qui permet de mettre dans un fichier texte tout ce qui est alloué et désalloué durant l'execution du prog. Et tout semble bon a la fin de chaque tour de boucle ma memoire revient a 0.
Je n'ai pas pu faire une boucle de 5000 itérations avec ses fonctions de controle car le fichier texte généré devient trop gros à gérer.

Avez vous une idée vers quoi je pourrais me tourner pour résoudre mon pb ?

Merci d'avance.

11 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
il n'y a pas de devin ici, sans voir ton code personne ne pourra rien dire.

ciao...
BruNews, MVP VC++
Messages postés
178
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
SI SI BruNews, ....

.... Ähum... Ahum....

Je vois..... je vois.... un bug à la ligne 5678 !!!!

Bon, trêve de plaisanterie, laissons Mme Irma au placard, il est le code ?
Messages postés
13
Date d'inscription
jeudi 12 juillet 2007
Statut
Membre
Dernière intervention
16 février 2014

je veux bien vous le filer mais y a pas mal de fichiers. Je vais mettre un lien rapidshare mais je sais pas si le forum accepte ...

Dans le main la boucle est sur 100 itérations en mettant 5000 ca passe plus.

http://rapidshare.com/files/42754369/source_rep_13-07-07.zip.html
Messages postés
13
Date d'inscription
jeudi 12 juillet 2007
Statut
Membre
Dernière intervention
16 février 2014

par contre y a des fonctions mwatch dans mon main qui peuvent etre enlevées elles ecrivent dans un fichier texte les allocations mémoires etc... (avec 5000 itérations le fichier txt sera trop gros pour être analysé)
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Bas, je compte pas passez 3 jours pour comprendre ton code :) donc j'ai peur que tu sois tout seul sur ce coup. La seule chose que tu peux faire, c'est télécharger un bon debuggeur, et au boulo. Il te faut des messages d'erreurs supplémentaires.
Messages postés
178
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
Bon, j'ai jeté un coup d'oeil à ton source et je me demande comment tu a pu compiler ca et avec quel compilo..

Ton compilo est compatible C99 a cause du "inline"... Ah, je viens juste de remarquer que tu as indiqué 'Cygwin"...

Tu déclare des fonctions dans des fichiers c sans avoir une définition dans un header .. Ton linker bosse pour toi et te rattrape le coup mais il ne devrait pas car par exemple tu declares une fonction GrayIntImage__delete avecdeux paramètres et dans ton fichier main.c, tu l'appele avec un seul paramètres... Ce code n'aurait pas du compiler !!! Et sans parler la tonne de warnings de casts unsafe, ....

J'ai modifié (car VS2005 ne supporte pas C99 et pour une fois je les comprends) et corrigé ton code (gestion définition / déclartion de fonction, ..) pour pouvoir le compiler avec VS2005 et je n'ai aucun problème j'ai fait une bulce jusqu'a 20000 sans soucis..

Remarques : y a des choses qui ralentissent grandemment le code   et y a matiere à beaucoup optimiser le code ... sur ma machine ton code avec une boucle de 6000 items prend 200 sec.... Peut meux faire...

Ma foi, déja corrige l'appel à la fonction GrayIntImage__delete...

Si tu veux le code modifié, mail moi...
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Pour l'histoire des fonctions sans déclaration dans le header. Ya pas de soucis. Si ces fonctions sont juste utilisées dans ce meme fichier.
Messages postés
178
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
Merci luhtor.... mais cela va de soi !

Mais le code de timeKill définissait des fonctions dans un source A non  déclarées ou redeclarée différemment dnas un header A et appelée dans un source B selon le prototypage du source A...

De plus, même fichier ou pas on s'en fout ! Le seul impératif du compilo est de connaitre le prototype d'une fonction lors de son appel ! C'est tout.

Si tu déclare une fonction dans le même source mais après l'appel cela ne compilera pas. Donc ton assertion telle quelle est fausse.

Bonne journée ensoleillée...
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Tu chipottes :) Tu peux mettre ta définition dans le .cpp. L'intéret c'est que la fonction n'est pas visible ailleurs que dans ton fichier .cpp, mais bon tout le monde le sait ca et c'est pas la discution.
Messages postés
13
Date d'inscription
jeudi 12 juillet 2007
Statut
Membre
Dernière intervention
16 février 2014

Merci beaucoup les gars d'avoir regarder mon code, c'est pas facile de rentrer dans le code de quelqu'un d'autres. Merci pour vos conseils je vais essayer de modifier tout ca.
Messages postés
13
Date d'inscription
jeudi 12 juillet 2007
Statut
Membre
Dernière intervention
16 février 2014

J'ai réussi à améliorer mon code  mais cependant je retombe
toujours sur le même problème mais beaucoup plus tard si je rajoute
plus d'itérations. J'ai utilisé gdb pour voir si je pouvais détecter
quelquechose et j'ai peut être une piste.

J'ai mis un break point dans une fonction, celle qui normalement je
pense fait le segmentation fault et je me suis aperçu d'une chose.

Au fur et à mesure des itérations la même structure allouée (pList) n'est jamais à la même adresse:

par exemple d'une itération à une autre j'ai :


itération i:

pList=0x6d8620

itération i+1:


pList=0x6d85f8

itération i+2:


pList=0x6d85d0

....

jusqu'à ce que ce soit


pList=0x1 et là j'obtiens le segmentation fault dans un accès à cette structure


Vous avez une idée sur  ça?

Apparemment je n'avais pas de fuites mémoire mais peut-être je devrais réinvestiguer sur ce point là ...

Parallèlement ce qui est bizarre c'est que si j'affiche un printf à chaque itération mon programme passe ...


Merci d'avance.