OVH Cloud OVH Cloud

environment variable MallocHelp ???

4 réponses
Avatar
pere.noel
je suis là page (TN 2124 : Mac OS X Debugging Magic)
<http://developer.apple.com/technotes/tn2004/tn2124.html#SECENV>

comme je lance mon essai depuis textmate et que mon shell par défaut est
zsh (même sous TextMate) afin d'avoir ce MallocHelp je fais :

puts `cd ext; rm -f *.bundle; rm -f *.o; ruby extconf.rb` if
(!FileTest.exists?("ext/MakeFile"))
puts `cd ext; make`
`zsh debugg-on.zsh; ruby sample/sample_raliasrecord.rb; zsh
debugg-off.zsh` if ($? === 0)

avec debugg-on.zsh :

export MallocStackLogging=1
exit 0

car bizarement, depuis ruby (mon script de lancement est en ruby), je ne
peux pas faire "bêtement" :
`export MallocStackLogging=1`

ça me dit command export not found ???

pourtant depuis ruby, si je fais :

puts ENV['SHELL']

j'ai bien :

/usr/local/bin/zsh

et donc, si je poste c'est ça ne me donne rien de mieux ...

le pb étant de trouve pourquoi j'ai une tétrachiée de messages :
> ruby(6571) malloc: *** Deallocation of a pointer not malloced:
> 0xbfffb3d8; This could be a double free(), or free() called
> with the middle of an allocated block; Try setting environment
> variable MallocHelp to see tools to help debug
depuis un C ...
--
une bévue

4 réponses

Avatar
luc
Une bévue wrote:

car bizarement, depuis ruby (mon script de lancement est en ruby), je ne
peux pas faire "bêtement" :
`export MallocStackLogging=1`


Heu, est-ce que tu peux m'expliquer l'intérêt de tout faire depuis un
script Ruby si à part deux puts et un if tout le reste est du shell ?!??
Encore une fois tu te compliques la vie à l'extrème pour je ne sais
quelle raison :)

--
Luc Heinrich

Avatar
pere.noel
Luc Heinrich wrote:

Heu, est-ce que tu peux m'expliquer l'intérêt de tout faire depuis un
script Ruby si à part deux puts et un if tout le reste est du shell ?!??


ça m'évite de mélanger les syntaxes...

déjà que je commence à utiliser la syntaxe C dans un script Ruby

Encore une fois tu te compliques la vie à l'extrème pour je ne sais
quelle raison :)


je ne pense pas.

mais bon je suis parvenu à pointer correctement
export MallocStackLogging=1

au term ))

ça ne m'a rien donné de +

basiquement j'ai ça en tête de ma fonction :

char *file_name;
file_name = (char *) malloc (1024);
char *token;
token = (char *) malloc (1024);


et juste avant le return :
free(file_name);
free(token);

et seul le "free(file_name)" me donne :
ruby(12545) malloc: *** Deallocation of a pointer not malloced:
0x181d80c; This could be a double free(), or free() called with the
middle of an allocated block; Try setting environment variable
MallocHelp to see tools to help debug.

le fameux "MallocHelp=1" ne donnant rien de + comme info.

je ne vois pas pourquoi les deux pointeurs file_name et token se
comportent différemment.

ah si je viens de piger , j'ai qqpart :

while(token != NULL) {
file_name = token;
token = strtok(NULL, needle);
pieces[i]=token;
i++;
}

donc file_name pointe sur token, pas d'alloc même s'il y a un malloc...

ça veut dire que l'allocation mémoire n'est effective qu'à l'assignement
?

la dealloc de mes pieces pose aussi problème.

allocation :
char *pieces[32];
while(j < 32) {
pieces[j] = (char *) malloc (1024);
j++;
}

de-allocation :
j = 0;
while(j < 32) {
free(pieces[j]);
j++;
}

je ne teste pas la length effective de mon array de pointeurs, est-ce le
pb ?

utilisation :
token = strtok(target_path_cpy2, needle);
strcat(parent_path, needle);
strcat(parent_path, token);
pieces[0]=token;

while(token != NULL) {
file_name = token;
token = strtok(NULL, needle);
pieces[i]=token;
i++;
}

while(j < i-2) {
strcat(parent_path, needle);
strcat(parent_path, pieces[j]);
j++;
}



--
une bévue

Avatar
luc
Une bévue wrote:

ça m'évite de mélanger les syntaxes...


Gné ? Elles *sont* mélangées, justement.

je ne pense pas.


Je pense que si. Tu as un lourd passif... :)

ça veut dire que l'allocation mémoire n'est effective qu'à l'assignement
?


Ca veut dire que tu n'as pas suivi les conseils qui t'ont été donnés
absolument partout: essaye de comprendre le C, les pointeurs et les
allocations dynamiques de mémoire *d'abord*.

la dealloc de mes pieces pose aussi problème.

allocation :
char *pieces[32];
while(j < 32) {
pieces[j] = (char *) malloc (1024);
j++;
}


j est initialisé où là ?

de-allocation :
j = 0;
while(j < 32) {
free(pieces[j]);
j++;
}


Et une petite boucle 'for', hein ? Ce serait pas mieux ?

je ne teste pas la length effective de mon array de pointeurs, est-ce le
pb ?


Le problème c'est que tu mélanges absolument tout, dans tous les sens,
sans avoir l'air d'essayer de comprendre.

--
Luc Heinrich

Avatar
pere.noel
Luc Heinrich wrote:

Ca veut dire que tu n'as pas suivi les conseils qui t'ont été donnés
absolument partout: essaye de comprendre le C, les pointeurs et les
allocations dynamiques de mémoire *d'abord*.


j'ai fait un test justement cet aprems, le premier ex trouvé a été sur
<http://rperrot.developpez.com/articles/c/allocationC/#L2>

il ne compile pas...

la dealloc de mes pieces pose aussi problème.
[...]



j est initialisé où là ?


ce n'est pas le pb.


de-allocation :
j = 0;
while(j < 32) {
free(pieces[j]);
j++;
}


Et une petite boucle 'for', hein ? Ce serait pas mieux ?


bof


je ne teste pas la length effective de mon array de pointeurs, est-ce le
pb ?


Le problème c'est que tu mélanges absolument tout, dans tous les sens,
sans avoir l'air d'essayer de comprendre.


c'est ça, exactement !
--
une bévue