Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/06/2008, à 14:13

Eldermê

[Résolu] question à propos de la gestion de la mémoire

Bonjour à tous,

Je développe actuellement un petit jeu en C++, utilisant OpenGL et SDL. Lorsque je lance mon application une première fois, tout se déroule sans problème. Idem, semble-t-il, lorsque je la quitte. Juste là tout va bien !

Mais, il arrive que (une fois sur deux à peu près), lorsque je relance l'application, ça plante avec un charmant "segmentation fault". Lorsque ça arrive, plus moyen de lancer l'appli à moins de la recompiler (comprends pas : je recompile exactement la même chose et ça marche...) ou de rebooter la machine (ça encore, je peux comprendre).

Vue l'erreur, je suspecte un problème de gestion de la mémoire. Mais, ce qui me laisse perplexe, c'est que ça ne plante jamais la première fois, mais uniquement lorsque j'ai déjà lancé et quitté l'appli avant. J'ai fait un effort pour éviter toute (enfin, j'espère !) fuite de mémoire pendant l'exécution du jeu, mais je dois reconnaître que lorsque je le quitte, je ne me suis pas posé de questions...

Je pensais que l'OS s'occupait de faire le ménage et veillait à ce que, lorsqu'on quitte un programme, toute la mémoire qu'il utilisait soit libérée. Est-ce vraiment le cas à 100% ? Se peut-il qu'il reste de la mémoire ayant été allouée par l'appli et qui ne soit pas libérée proprement lorsque l'appli a été fermée ?

Est-ce que quelqu'un pourrait m'éclairer sur ce point ? Merci d'avance.

Dernière modification par Eldermê (Le 05/06/2008, à 07:49)


Mon blog : petit projet de jeux en 3D (libres, bien sûr).

Hors ligne

#2 Le 04/06/2008, à 14:42

iuchiban

Re : [Résolu] question à propos de la gestion de la mémoire

Bah faut analyser le core qui est crée pour voir ce qui fait planter ton programme.
Ou bien mettre beaucoup d'affichage de controle pour voir a quel moment ca plante.

Tu alloues des plages de combien d'espace?? Et tu as combien de mémoire installée??

Je pensais que l'OS s'occupait de faire le ménage et veillait à ce que, lorsqu'on quitte un programme, toute la mémoire qu'il utilisait soit libérée.

Ca ca dépend du langage utilisé (java ou ruby ont un garbage collector)

Dernière modification par iuchiban (Le 04/06/2008, à 14:43)


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#3 Le 04/06/2008, à 14:44

telliam

Re : [Résolu] question à propos de la gestion de la mémoire

si tu as un segmentation fault ce n'est pas forcement du a une fuite mémoire, cela peut etre du  par exemple à un pointeur invalide. est ce qu'il y a un fichier core généré suite au plantage?

Dernière modification par telliam (Le 04/06/2008, à 14:44)


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#4 Le 04/06/2008, à 14:47

telliam

Re : [Résolu] question à propos de la gestion de la mémoire

iuchiban a écrit :

Ca ca dépend du langage utilisé (java ou ruby ont un garbage collector)

nuance : le garbage collector c'est pour la gestion de la mémoire pendant la "vie" de l'application (java ou ruby)
en fin de process c'est l'OS qui prend la main.


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#5 Le 04/06/2008, à 15:26

Eldermê

Re : [Résolu] question à propos de la gestion de la mémoire

Merci pour vos réponses. Je ne suis pas chez moi, là, donc je vais essayer de répondre comme je peux.

Ca ca dépend du langage utilisé (java ou ruby ont un garbage collector)

C'est du C++, comme précisé dans mon premier message. wink

Tu alloues des plages de combien d'espace?? Et tu as combien de mémoire installée??

J'ai 832Mo de Ram (valeur exotique, car une ma carte graphique est à mémoire partagée). Je ne sais pas combien j'alloue exactement. Mais quand je jeu tourne, il ne me prend que 5% de la mémoire. Donc, il y a de la marge.

si tu as un segmentation fault ce n'est pas forcement du a une fuite mémoire, cela peut etre du  par exemple à un pointeur invalide. est ce qu'il y a un fichier core généré suite au plantage?

Je regarderai ce soir. J'ai plus l'habitude de débugger en faisant afficher des messages en console en fait.

Ca plante au début, pendant l'initialisation : avant que l'on puisse envoyer un événement quelconque au programme. C'est donc quelque chose qui est censé se passer exactement de la même manière à chaque fois. C'est pour ça que je pense à un problème dans la gestion de la mémoire puisqu'il me semble que l'état de la mémoire est le seul truc qui peut être différent lorsque je lance mon appli. Bien sûr, je peux me tromper.

Je commence par initialiser SDL : ça, ça passe bien à chaque fois. Ensuite, j'initialise quelques variables et je charge mes textures pour mes objets en 3D. C'est là que ça plante : au moment où je vais charger la première texture. Je veux bien croire qu'il puisse y avoir un pointeur invalide quelque part. Mais dans ce cas-là, ça planterait à chaque fois, non ?


Mon blog : petit projet de jeux en 3D (libres, bien sûr).

Hors ligne

#6 Le 04/06/2008, à 21:05

rniamo

Re : [Résolu] question à propos de la gestion de la mémoire

t'as essayé un backtrace ?


< Quelques un des mes programmes  | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
        \   ^__^
         \  (o o)\_______
            (___)\            )\

Hors ligne

#7 Le 04/06/2008, à 21:35

Eldermê

Re : [Résolu] question à propos de la gestion de la mémoire

Maintenant que j'ai mis les options qui vont bien dans mon .bashrc, j'ai bien un fichier core (je ne sais pas s'il faut s'en réjouir d'ailleurs !).

Ça plante parce que la fonction fopen échoue pour ouvrir une fichier qui contient une image png (le chemin qu'elle reçoit en paramètre est pourtant exact, je l'ai fait afficher juste avant l'appel à la fonction ; de plus, il n'y a jamais qu'un seul fichier ouvert à la fois, et je le referme quand on n'en a plus besoin). Et je n'ai rien prévu pour rattraper le programme dans ce cas.

Soit tout se passe bien, soit ça plante exactement à la 9ième image. Tout cela me laisse perplexe... Qu'est ce qui peut bien traumatiser cette brave fonction fopen ? Si quelqu'un a une piste, ça m'aiderait bien.

Le bout de code concerné ressemble à ça :

	FILE *fp = NULL;	
	cout << "jolie texture : " << filename << "\n";
	fp = fopen (filename, "rb");
  	if (!fp) {
    	fprintf (stderr, "error: couldn't open \"%s\"!\n", filename);
    }

Mon blog : petit projet de jeux en 3D (libres, bien sûr).

Hors ligne

#8 Le 04/06/2008, à 21:54

abetsic

Re : [Résolu] question à propos de la gestion de la mémoire

Tu peux essayer d'utiliser perror qui te renseignera plus précisément sur l'erreur survenue.

Pour des problèmes de segmentation fault il y a aussi l'outil valgrind que tu peux utiliser qui est vraiment très pratique ! Il te donne quasiment la ligne responsable du segfault. Il faut que ton programme soit compilé avec l'option -g.

Hors ligne

#9 Le 04/06/2008, à 22:23

telliam

Re : [Résolu] question à propos de la gestion de la mémoire

si le pointeur filename a une adresse invalide pour une raison ou une autre tu auras un seg violation


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#10 Le 05/06/2008, à 07:48

Eldermê

Re : [Résolu] question à propos de la gestion de la mémoire

telliam a écrit :

si le pointeur filename a une adresse invalide pour une raison ou une autre tu auras un seg violation

Oui, c'était ça. Je viens de découvrir que je faisais une manip pas très propre sur ce pointeur filename. Une erreur stupide, mais encore fallait-il la voir. C'est corrigé maintenant et ça a l'air de marcher. En tout cas, j'ai testé le programme une vingtaine de fois et ça n'a plus planté. On va supposer que c'est bon...

Je vais pouvoir avancer, youpi !

Merci à tous pour votre aide. C'est toujours appréciable d'avoir un point de vue extérieur. J'avoue que quand je suis plongée dans mon code, je ne cherche pas forcément les erreurs là où elles sont. Merci encore.


Mon blog : petit projet de jeux en 3D (libres, bien sûr).

Hors ligne