2012-12-07 3 views
1

Je suis vraiment perdu ici. Peut-être que certains d'entre vous peuvent me diriger vers une bonne direction.Segfaults à partir de DOS, mais fonctionne à partir de GDB exécuter

Je développe un outil en ANSI C en utilisant GCC sur MinGW. L'outil doit être exécuté uniquement à partir de la ligne de commande. Probablement seulement sur la machine de Windows. Il élabore certaines données localement et génère des fichiers à utiliser par d'autres programmes. Fondamentalement, il fait beaucoup de maths et quelques manipulations de fichiers. Rien de vraiment chic. Je ne l'ai pas trouvé nécessaire de publier les lignes entières plus de 1000 ici pour l'examen ...

Je compile avec GCC -ansi en s'assurant pas même un seul avertissement est présent. Tout a toujours bien fonctionné à mesure que le développement évoluait. Mais récemment, j'ai commencé à avoir des segavires (presque) aléatoires. J'ai vérifié les dernières modifications apportées, mais je n'ai rien trouvé. J'ai enlevé complètement les derniers changements pour revenir à quand ça a parfaitement fonctionné. Segfaults toujours. J'ai tracé ligne par ligne. Je suis retourné lire et relire tout le code à la recherche d'éventuelles erreurs de pointeurs/malloc. Je ne peux tout simplement pas trouver la raison pour laquelle il échoue si souvent et de façon si aléatoire.

Donc, voici la chose étrange - je l'ai compilé avec -g et courir à travers GDB.

début MSYS changement dir où le programme réside $ gdb generatore.exe (celui -g compilé qui échoue dans le DOS) $ exécuter

Et il fonctionne parfaitement à l'intérieur GDB. Je suis allé étape par étape. Ligne par ligne. Parfait. J'ai essayé de le souligner avec d'énormes quantités de données. Tout fonctionne Impossible de reproduire l'erreur. Mais si le même exécutable est exécuté via DOS, il échoue.

Je soupçonne un comportement imprévisible avec un pointeur mais je ne le trouve nulle part.

Est-ce que quelqu'un a déjà rencontré quelque chose de similaire? Où devrais-je vérifier? En outre, je ne suis pas aussi familier avec GDB, car il fonctionne bien, puis-je appliquer le contrôle en quelque sorte pour trouver la raison dans le DOS, il échoue? Y a-t-il d'autres solutions de débogage gratuites pour Windows que vous pouvez me conseiller? Comment puis-je déboguer pour des comportements imprévisibles?

Merci beaucoup pour votre attention, maxime

Répondre

0

Il est un outil gratuit pour attraper toutes sortes d'erreurs d'exécution pour faire avec les pointeurs, les allocations de mémoire, désallocations, etc., qui ne peut être pris au moment de la compilation , donc votre compilateur ne vous en avertira pas: valgrind http://valgrind.org/. Le problème est, AFAIK il ne fonctionne pas sur Windows. Cependant, si votre programme est en ANSI C pur, vous devriez pouvoir le construire et l'exécuter avec valgrind sur une machine Linux.

Je ne suis pas sûr à 100% à ce sujet, mais il devrait fonctionner correctement sur une machine virtuelle, donc si vous n'avez pas d'ordinateur Linux séparé, vous pouvez essayer d'installer par exemple. Ubuntu dans Virtual Box ou VmWare et essayez d'exécuter votre programme avec valgrind dedans.

+0

Merci piokuc. J'ai lu que valgrind était un excellent outil, mais il me faudra un peu de temps pour définir un environnement Linux ici. Certainement mon prochain mouvement. Merci beaucoup. – MAXIM

+0

@ user1885558 Je sais, ça ressemble à beaucoup d'efforts pour installer un Linux, mais ça vaut le coup, c'est bien d'en avoir un autour. Vous ne le regretterez pas :) – piokuc

+0

Vous avez un compte Amazon AWS sur lequel je lance Valgrind. Trouvé ~ 40mb de mémoire qui fuit ... Fixé cela. Maintenant, ots est stable sur les deux systèmes. Je me rends compte encore et encore, vous n'irez nulle part sans un Linux de votre côté. Merci, piokuc! – MAXIM

Questions connexes