J'ai des problèmes avec un programme causant une défaillance de segmentation lorsqu'il est exécuté sur un Mac. Je pose une entrée pour le IOCCC , ce qui signifie que les choses suivantes sont vraies à propos de mon programme: < / p>
Je n'ai pas de machine Linux à réutiliser, mais comme un test final, j'ai essayé de la compiler et de l'exécuter sur un MacBook Pro - Mac OSX 10.6.7, XCode 4.2 (I.e. GCC 4.2.1). Encore une fois, il compile proprement de la ligne de commande. Il semble que sur un Mac Ticing "PROG" ne produise pas le programme compilé, mais "Open PROG" semble. Rien ne se passe pendant environ 10 secondes (mon programme prend environ une minute pour courir quand elle réussit), mais elle dit simplement "faute de segmentation" et se termine. P>
Voici ce que j'ai essayé, de suivre le problème, en utilisant les réponses principalement glanées de Ce fil d'imperpillage utile : p>
AVERTISSEMENT: Impossible de restaurer le cadre précédemment sélectionné. Pas de mémoire disponible pour programmer maintenant: dangereux d'appeler Malloc P> blockQuote>
Je suis à court d'idées. J'essaie d'obtenir Cygwin mis en place (il prend des heures) pour voir si l'un des outils fonctionnera de cette façon, mais si cela échoue, je suis à perte. Il doit sûrement y avoir des outils capables de suivre les causes des défauts de segmentation sur un Mac? P>
3 Réponses :
Avez-vous compilé avec -g code> et exécutez-le à l'intérieur
gdb code>? Une fois que l'application se bloque, vous pouvez obtenir une backtrage avec
bt code> qui devrait vous montrer où le crash survient p>
Parfait! Je n'avais pas déjà utilisé GDB auparavant, mais cela a tout de suite frappé le problème et a rendu le problème clair de manière à ce que Xcode ait complètement manqué et misérablement. Si quelqu'un est intéressé, mon problème semblait descendre à la façon dont le MacBook Pro a manipulé l'arithmétique de point flottant. Mon code contient une fonction récursive qui cesse de recouverte lorsqu'elle a trouvé la bonne réponse à une petite tolérance définie, mais sur le MacBook, il ne semblait jamais trop se rapprocher, alors il a recouvré pour toujours et soufflé la pile de pile (hehe, débordement de pile .. .). Augmenter la tolérance tout corrigé.
Insérez la référence à
Notez que sur les nouvelles versions OS / XCode, vous utilisez lldb code> à la place. Cela fonctionne de la même manière, cependant.
Fait ma journée après une décennie (septembre 2021). Merci.
pour plus moderne lldb code> saveur
Merci, c'était un économiseur de vie.
Dans de nombreux cas, MacOS stocke les journaux de collision récents du programme sous Habituellement, je vais essayer les étapes suivantes lors du dépannage sur MacOS: P>
Quelques liens: P>
[1] https://mac-optimization.destreviews.net / analyser-mac-crash-rapports / P> ~ / Bibliothèque / Journaux / DiagnosticReports / Code> Dossier. P>
~ / Bibliothèque / Journaux / DiagnosticReports / Code> Li>
{votre_program} _ {crashing_date} _ {id} _ {your_host} .crash code> li>
écrasé code> pour localiser le fil causant le crash. Il vous montrera la trace de la pile lors du crash et, dans de nombreux cas, la ligne exacte du code source causant également le crash sera également enregistré. Li>
ol>
Comme avec n'importe quel Unix, sauf si
PROG code> est dans votre page
code>, vous devez spécifier le chemin d'accès à
PROG code> pour l'exécuter, par exemple.
./ PROG CODE> Dans le répertoire, il vit. C'est la même histoire avec l'invocation Valgrind ci-dessus; Il devrait probablement être
Valgrind -leak-check = yes ./prog code>. N'utilisez pas
Ouvrir code> pour exécuter votre code.
Quant à ne pas avoir accès à une machine Linux ... sérieusement? Il suffit de télécharger une image de CD en direct de Ubuntu, mettez-la sur un lecteur CD / USB et démarrer dans ... omg poneys! C'est comme totalement linux i>. (Désolé d'être un peu snarky, mais de déterminer cette solution pas i> nécessite que vous soyez un chirurgien de fusée.)