2009-10-22 10 views
2

J'aimerais expérimenter le tcmalloc de Google sur Linux ... J'ai un énorme projet ici, avec des centaines de makefile générés par qmake ... Je voudrais trouver un moyen de faire un lien global entre gcc et tcmalloc (comme ça fait avec libc) ... Est-ce possible? Ou devrais-je modifier chaque Makefile?Utilisez-vous globalement malloc de Google?

(je préfère ne pas modifier tous les fichiers pro comme il y a des centaines d'entre eux)

(De plus, nous avons déjà essayé la méthode LD_PRELOAD et il ne fonctionne pas tout à fait raison) ...

+0

Vous ne pouvez pas éditer les fichiers .pro de qmake? – liori

+1

Pouvez-vous donner plus d'informations sur LD_PRELOAD ne fonctionne pas correctement? Que ressentez-vous exactement lorsque vous essayez d'utiliser LD_PRELOAD? –

+1

Eh bien, il semblait qu'une partie seulement de l'application utilisait tcmalloc ... De larges bandes de ses allocs n'allaient PAS à tcmalloc ... J'ai essayé d'utiliser ltrace pour le vérifier mais ltrace s'est écrasé assez rapidement (BTW, ltrace n'a montré que des appels en qt, et tcmalloc aussi seulement généré un rapport montrant le code qt ... Cependant, beaucoup plus de choses appellent malloc dans cette application) ... – dicroce

Répondre

4

Comment vos fichiers makefiles accèdent-ils au compilateur (gcc/g ++/cc/C++)?

Si c'est juste par nom (g ++), et non par chemin d'accès explicite (/usr/bin/g ++), vous pouvez simplement créer un g de remplacement ++ quel que soit le répertoire que vous préférez, et préfixer ce répertoire à votre chemin.

Par exemple: Créer un   ~/mytmpgccdir/g ++ fichier  :

#!/bin/tcsh -f 
exec /usr/bin/g++ -Lfoo -lfoo $*:q 

Ajout tout extras (-lfoo -lfoo) vous aimez, que ce soit avant ou après les autres arguments ($ *: q).

Ensuite, pré-pend à votre chemin et faire normalement.

#tcsh version 
% set path = (~/mytmpgccdir/ $path:q) 
% make clean 
% make 

p.s. Si c'est par un nom explicite, vous pouvez peut-être le remplacer sur la ligne de commande. Quelque chose comme:   faire tous GCC = ~/mytmpgccdir/gcc

p.p.s Si vous utilisez LD_PRELOAD, vous voudrez peut-être un script comme celui-ci à setenv LD_PRELOAD avant de lancer votre programme. Sinon, il est facile de liquider LD_PRELOAD sur chaque commande comme/bin/ls, make, g ++, etc.

+0

Génial!Je vais donner un coup de feu! – dicroce

+0

http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ –

2

Commencez par vérifier la documentation de qmake. Il est un moyen facile de spécifier (dans un fichier .pro) qu'une certaine bibliothèque doit toujours être lié à

De plus, puisque vous êtes juste expérimenté, utilisez simplement LD_PRELOAD - pas recompilation nécessaire.

LD_PRELOAD="/usr/lib/foo/libtcmalloc.so" ./your_program

Vous n'avez pas besoin d'avoir associé "votre_programme" à la bibliothèque tcmalloc de google.