Connexion
Vous n'avez pas encore de compte personnel ? Vous devriez en créer un. Une fois enregistré vous aurez certains avantages, comme pouvoir modifier l'aspect du site, ou poster des commentaires signés...
Support
Activité du Site

Pages vues depuis 06/01/2019 : 13 157 072

  • Nb. de membres 367
  • Nb. d'articles 2 846
  • Nb. de forums 24
  • Nb. de sujets 13
  • Nb. de critiques 0

Top 10  Statistiques

Index du forum »»  Développement »» Layers

Layers#661

3Contributeur(s)
rusbackTchekoYomgui
2 Modérateur(s)
PapiosaurBeWorld
rusback rusbackicon_post
Hello,

J'ai un petit souci concernant une partie d'un programme sur les layers...
Ca bugue grave avec une libération de mémoire incompléte avec un pointeur invalide...

Voici 2 structures pour commencer, qui concerne le programme.

struct EntryInfo
{
struct FullLayer *ei_Layer;
struct EntryInfo *ei_Next;
struct EntryInfo *ei_Pred;
struct Icons ei_Image;
struct Module *ei_module;
struct TaskList *ei_tl;
CxObj *ei_cxobj;
BOOL ei_redraw;
BOOL ei_!refresh!;
BOOL ei_owncolor;
BOOL ei_changed;
BOOL ei_valid;
....
....
....
}

struct FullLayer
{
struct Node fl_node;
struct EntryInfo *fl_Entry;
struct EntryInfo *fl_Active;
struct EntryInfo *fl_LastActive;
struct EntryInfo *fl_Remove;
struct EntryInfo *fl_Current;
struct EntryInfo *fl_Parent;
struct Window *fl_Window;
....
....
....
}

Voici la partie du programme qui plante...

struct FullLayer *ReadDirectory(BPTR Prefs)
{
struct EntryInfo *ei, *lei;
struct FullLayer *Layer;
char *Line;
LONG Back;
BOOL Test;
BOOL upSet;
ULONG dummy, rgb, txtrgb;

upSet=FALSE;
cnt++;
rgb = 0x00;
txtrgb = textrgb;
Layer = AllocPooled(pool, sizeof(struct FullLayer));
if(Layer)
{
Layer->fl_rgb = rgb;
Layer->fl_textrgb = txtrgb;
Layer->fl_Entry = AllocPooled(pool, sizeof(struct EntryInfo));
if(Layer->fl_Entry)
{
Layer->fl_Entry->ei_rgb = Layer->fl_rgb; //trgb;
Layer->fl_Entry->ei_textrgb = Layer->fl_textrgb;
Layer->fl_Entry->ei_labelrgb = Layer->fl_textrgb;
Test = TRUE;
Layer->fl_Active = Layer->fl_Entry;;
ei = Layer->fl_Entry;
ei->ei_Ratio = 100;
ei->ei_stack = 4096;
lei = NULL;
}
else
{
FreePooled(pool, (UBYTE*)Layer, sizeof(struct FullLayer));
Layer = NULL;
}
}
return(Layer);
}

J'ai fait plusieurs essais...
mon premier essai a été de mettre entre /*... */ la partie commençant entre
Layer->fl_rgb = rgb; et finissant à la fin de Layer = NULL; } résultat ca buggue pas ca roule...
Mon essai suivant a été de tout laisser et là ça buggue dur lors de l'éxécution du programme.
Pourtant, tout me parait normal.

Si quelqu'un pouvait me donner un coup de main ou me donner un indice ou + pour m'aider je serais bien content
pour continuer ce programme.
MorphOS, c'est le meilleur
Tcheko Tchekoicon_post
Yop,

Tu peux remplacer les AllocPooled & FreePooled par des AllocVecTaskPooled/FreeVecTaskPooled (qui fait approximativement la même chose et qui, cerise sur le gâteau, les blocs n'ayant pas fait l'objet d'une libération le sont à la sortie du programme).

Concernant le plantage, il n'a pas lieu dans le code que tu nous as passé. Si le debug indique un pointeur invalide, c'est que tu dois lui fournir une mauvaise adresse. Assure toi de ne pas modifier le pointeur entre l'allocation et la libération.
Si le pointeur est bon, alors peut être qu'il y a un trash dans les octets qui précèdent le bloc alloué.

Un coup de wipeout (dispo dans le sdk) peut aider pour trouver les erreurs liés à la mémoire. (la dernière fois que je l'ai utilisé, j'ai retiré trois bugs lié à la mémoire, sur des trucs qui semblaient anodins mais en fait pas du tout...)

Egalement, le tutoriel de henes concernant le déboguage est indispensable pour débusquer les bugs.

Compiler sans optimisations, avec -g.
Linker avec -ldebug et truffer le code de kprintf("xxxx").

Une macro utile :

#ifdef DEBUG
#define D(x) x
#else
#define D(x)
#endif

et placer le kprintf("...") dedans.

Un #define DEBUG suffit pour activer/desactiver le debug (bien utile pour une release sans sortie debug).

textrgb est une globale? :)

Sinon, bonne chasse.

:)
Yomgui Yomguiicon_post
@rusback: si on pouvait avoir le context cela serait mieux car là c'est pas évident avec tout ce qui manque comme code!

Tu peux commencer par des alloc bêtes genre AllocMem(), plutôt que les pools?
Les pools c'est bien, mais mal gérés c'est pire. Genre si tu as pas le flags SEM_PROTECTED ton pool en multithreading = crash.

Et ca plante où ? tu as regardé le log? tu as lu le tutorial sur le debug d'Henes?
--

http://blog.yomgui.fr/
http://www.yomgui.fr/yiki/doku.php
http://www.yomgui.fr/bugtracker
rusback rusbackicon_post
merci tcheko et yomgui pour vos réponses...

@tcheko: je vais faire quelques essais avec ta soluce et te tiendrait au courant...

@yomgui: dés que j'ai 5 minutes et le + rapidement possible, je joindrai le log et compléterai tes questions...

merci
MorphOS, c'est le meilleur
Yomgui Yomguiicon_post
@rusback: Commence vraiment par de AllocMem et pas des AllocXXXPool! Même pas les xxxTaskxxx.
Comme cela on sera sûr. Car vu ton code, la seule chose qui peut planter c'est de passer un pool invalide.
--

http://blog.yomgui.fr/
http://www.yomgui.fr/yiki/doku.php
http://www.yomgui.fr/bugtracker