Segmentation en mettant en boucle 5000 fois mon algo
timekill
Messages postés13Date d'inscriptionjeudi 12 juillet 2007StatutMembreDernière intervention16 février 2014
-
13 juil. 2007 à 17:34
timekill
Messages postés13Date d'inscriptionjeudi 12 juillet 2007StatutMembreDernière intervention16 février 2014
-
26 juil. 2007 à 13:56
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 :
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.
A voir également:
Segmentation en mettant en boucle 5000 fois mon algo
timekill
Messages postés13Date d'inscriptionjeudi 12 juillet 2007StatutMembreDernière intervention16 février 2014 13 juil. 2007 à 23:09
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é)
Vous n’avez pas trouvé la réponse que vous recherchez ?
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 13 juil. 2007 à 23:39
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.
cs_vicenzo
Messages postés178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 14 juil. 2007 à 11:55
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...
cs_vicenzo
Messages postés178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 14 juil. 2007 à 18:51
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.
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 15 juil. 2007 à 00:33
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.
timekill
Messages postés13Date d'inscriptionjeudi 12 juillet 2007StatutMembreDernière intervention16 février 2014 21 juil. 2007 à 18:08
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.
timekill
Messages postés13Date d'inscriptionjeudi 12 juillet 2007StatutMembreDernière intervention16 février 2014 26 juil. 2007 à 13:56
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 ...