2010-12-09 104 views
0

J'ai du mal à comprendre cela .. donc le temps de demander de l'aide.Qu'est-ce que cela pourrait être? [bug de programme]

OS: Mac OS X, Snow Leopard gcc

: version Xcode de gcc, 4.2.1

Bibliothèque: gmp, gmpxx

Problème: une fonction se bloque à droite à la fin avec:

flx_run(94749) malloc: *** error for object 0x7fff706d1500: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

Program received signal SIGABRT, Aborted. 
0x00007fff835cd886 in __kill() 
(gdb) bt 
#0 0x00007fff835cd886 in __kill() 
#1 0x00007fff8366deae in abort() 
#2 0x00007fff83585a75 in free() 
#3 0x00000001000bca45 in flxusr::gmp__hyphen_0::_init_() 
Previous frame inner to this frame (gdb could not unwind past this frame) 

Je ne demande pas libre() dans la fonction initialisation, et la fonction ne fonctionne correctement jusqu'à la boucle de fermeture accolade y .. donc le point de chute doit être dans les Destructeurs des objets locaux (à droite?)

La chose drôle est:

a) Le programme (semble) fonctionne très bien si elle est liée de manière statique, il ne échoue si le code est construit dans un fichier * .dylib et chargé dynamiquement. B) le programme échoue de la même manière avec deux versions complètement différentes de gmp/gmpxx. [4.3 ou quelque chose et 5.01]

c) les versions de liaison statiques et dynamiques fonctionnent très bien sur Ubuntu 10.5 LTS

Le code est généré par mon compilateur, il est pas le code écrit à la main. Le code utilisateur est exécuté par un programme de pilote de niveau supérieur. Le système exécute plusieurs centaines de tests de régression avec succès. Cependant, le code écrit à la main suivant est utilisé dans ce cas de test particulier:

namespace flx { namespace gmp { 
string flx_mpf_get_str(mpf_class const &a) 
{ 
    mp_exp_t x; 
    std::string s = a.get_str(x,10,0); 
    char b[100]; 
    std::snprintf(b,100,"e%ld",(long)x); 
    return std::string(".")+s+b; 
} 
}} 

mais cela me semble bien. Le cadre de pile de la fonction contient plusieurs objets mpz_class, mpq_class et mpf_class. En dehors des bugs dans gmp/gmpxx, la seule autre chose que je peux penser est que mon système d'exécution ou le code généré corrompent la mémoire. L'adresse étant "libérée" qui n'a pas été allouée est suspecte (c'est loin d'être le tas). J'ai construit une version de gmp avec l'option -g mais je n'ai plus d'informations (ce qui suggère que ce n'est pas une mauvaise chose à l'intérieur d'un destructeur de classe gmpxx).

J'ai besoin d'idées! Je n'ai aucune idée d'où regarder maintenant. Thx à l'avance :)

Lien vers la source

http://felix-lang.org:1116/ $/home/skaller/felix/felix/build/release optimisé/test/gmp/gmp-0.cpp

Meta: SO de démarque ne fonctionne pas! Donc vous devrez copier à la main.

pourrait tout aussi bien jeter le lien vers le code Felix car il est un peu plus lisible et a des choses amusantes dans ce (comme la syntaxe définie par l'utilisateur et si vous allez à la bibliothèque, vous pouvez voir classes de types instancié)

http://felix-lang.org:1116/ $/home/skaller/felix/felix/build/version-optimisée/test/gmp/gmp-0.flx

Répondre

0

Où avez-vous obtenu la source gmp? Il pourrait s'agir d'une version 32 bits (au moins macports n'offre pas de sources 64 bits). Snow Leopard est en revanche de 64 bits (par défaut).

Personnellement, je force tout le code à 32 bits par gcc -m32. Vous pourriez essayer la même chose.

br,
Juha

modifier:How to force /usr/bin/gcc -> /usr/bin/gcc -m32?

+0

gmp src de 5.01 de gnu, et oui, c'est 64 bits AFAIK. – Yttrill

+0

Juste à noter: Je ne veux pas spécifiquement le code 32 bits. Si j'avais mon chemin, je l'interdirais complètement de mon système. Peut être fait sur Linux mais pas si facile sur un Mac. – Yttrill

0

Vous ne pouvez pas désaffecter la mémoire allouée par une bibliothèque dynamique. Peut-être que c'est le problème ici. Vérifiez cette réponse: Shared libraries memory space

+0

Cette réponse me semble bidon. Sûrement c'est faux pour C. –

+0

Cette réponse est seulement pertinente sur Windows. – bmargulies

+0

La réponse est fausse, mais c'est un "lead" raisonnable: il semble que cela ait quelque chose à voir avec la désallocation d'objets créés dans une bibliothèque partagée, je ne ferais pas confiance à Apple pour avoir raison :) – Yttrill