je suis actuellement en train de travailler sur un programme qui, entre
autres, calcule les solutions d'une équation à partir d'un balayage (deux
boucles imbriquées) sur des conditions initiales. Pb: en plein milieu de la
boucle, le programme s'arrete et le message
Abandon(core dumped)
s'affiche. gdb ne m'est pas d'un tres grand secours puisque je ne sais pas a
quelle iteration l'erreur se produit (ca change d'une execution a l'autre)
et que l'erreur a lieu dans une fonction (memalign(), kill(), ou free()
selon les executions) appelee par une bibliotheque dont je n'ai pas acces au
code source. Bref, je sais que c'est flou tout ca, mais le probleme est
justement que je n'arrive pas a localiser l'origine du plantage.
Toute information susceptible de m'aider a trouver cette *@#&% !! d'erreur
(logiciels de debuggage, ...) m'interesse
Precision: le prg a ete compile avec -lefence et ca ne m'aide pas des
masses.
merci d'avance
Y.K.
Pour que l'on puisse t'aider, donne nous ton source.
Pascal
http://cournot.u-strasbg.fr/~kuhry/
Le fichier qui pose probleme est vraisemblablement steady.c (dans
manifold/src/). Le plantage a lieu lorsqu'on selectionne compute dans le
menu steady-states.
Les deux boucles imbriquées se trouvent dans la fonction steady_update().
C'est mon premier programme en C, alors je vous demande un peu d'indulgence.
Ceci etant, je ne tiens pas forcement a ce que quelqu'un se tape le boulot a
ma place, mais j'aimerais
quelques conseils pour rechercher plus efficacement les erreurs d'allocation
memoire
Y.K.
pascal bontoux <pascal....@ec-lyon.fr> a écrit dans le message :
3AD1BFC2...@ec-lyon.fr...
Yves Kuhry wrote:
> J'ai mis le source en libre disposition à l'adresse
>
> http://cournot.u-strasbg.fr/~kuhry/
>
> Le fichier qui pose probleme est vraisemblablement steady.c (dans
> manifold/src/). Le plantage a lieu lorsqu'on selectionne compute dans le
> menu steady-states.
> Les deux boucles imbriquées se trouvent dans la fonction steady_update().
> C'est mon premier programme en C, alors je vous demande un peu d'indulgence.
> Ceci etant, je ne tiens pas forcement a ce que quelqu'un se tape le boulot a
> ma place, mais j'aimerais
> quelques conseils pour rechercher plus efficacement les erreurs d'allocation
> memoire
>
> Y.K.
>
>
Heu, c'est normal si je n'arrive pas a avoir acces a dynamics-src.tgz ? le
lien semble hs.
Michael
Yves Kuhry wrote:
> Ben, non, c'est pas normal, ca devrait marcher.
Pourtant, j'ai un superbe not found.
Michael Demanet <m...@info.fundp.ac.be> a écrit dans le message :
3AD1D11D...@info.fundp.ac.be...
Bonne chance.
PS: ton programme est bien single-threaded ?
Je suis bien d'accord mais le probleme c'est que ca plante dans une boucle.
L'instruction marche n fois et plante la n+unieme. Si j'y vais pas a pas,
j'y serai encore dans 3 semaines. Pareil pour les watchpoints, si je savais
que ca plante pour i=54, j=87, il n'y aurait pas de pb. Le hic, c'est que
les erreurs d'allocations n'entrainent pas un plantage systematique.
>
> Bonne chance.
merci
>
> PS: ton programme est bien single-threaded ?
heu, ca veut dire quoi ca ?
>
>
>
>
Tu n'as qu'à ajouter des traces dans ton code.
Et si tu tiens vraiment à y aller avec un debugger, tu le lances avec le
fichier core en paramètre, il va se positionner directement sur
l'instruction du plantage et tu pourras voir l'état du programme à ce
moment-là, remonter dans la pile des appels etc...
--
Serge Danzanvilliers
J'ai bien fait un gdb sur le core mais ca ne m'avance pas plus. Selon les
cas, l'erreur a lieu dans free() ou kill(), mais quand je tape list, ca
m'affiche
1. init.c aucun fichier ou répertoire de ce type
et backtrace
#0 0x8060d54 in free ()
#1 0x400d4168 in ?? () from /usr/local/lib/liballeg-3.9.33.so
ce qui ne m'aide pas franchement.
Serge Danzanvilliers <mo...@club-internet.fr> a écrit dans le message :
9aukl2$21kd$1...@norfair.nerim.net...
> Merci en tout cas pour vos reponses.
>
> J'ai bien fait un gdb sur le core mais ca ne m'avance pas plus. Selon les
> cas, l'erreur a lieu dans free() ou kill(), mais quand je tape list, ca
> m'affiche
>
> 1. init.c aucun fichier ou répertoire de ce type
>
> et backtrace
>
> #0 0x8060d54 in free ()
> #1 0x400d4168 in ?? () from /usr/local/lib/liballeg-3.9.33.so
C'est donc la librairie Allegro qui fait un appel à free() alors qu'elle
ne devrait pas.
> ce qui ne m'aide pas franchement.
Essaye de trouver une librairie Allegro compilée avec les symboles de
debug, tu pourras remplacer le '??' de ton backtrace plus haut.
--
Erwann ABALEA
erw...@abalea.com
- RSA PGP Key ID: 0x2D0EABD5 -
Je serais toi, je ferais quelques tours dans la boucle pas a pas pour
verifier que TOUTES tes variables s'incrementent correctement aussi.
Initialise toutes tes variables a zero. Ca peut permettre d'avoir un
comportement moins aleatoire quand ca plante, et c'est bon pour ton corps.
A mon avis ton programme est bien single-threaded, c'est a dire en gros
qu'il n'y a qu'un programme qui s'execute en meme temps. Tu n'as pas deux
programmes qui s'executent en parallele, et qui vont lire et ecrire les
donnees sur la meme zone memoire.
D'une maniere generale, (je sais que j'enfonce des portes ouvertes), va voir
les parties de ton code ou tu fais des ecritures en memoires un peu au pif
(genre si t'alloues des espaces memoires de taille bizarre, que t'oublie la
taille de la zone, etc...)
re bonne chance.