У меня возникли некоторые проблемы с программой, вызывающей ошибку сегментации при запуске на Mac.Я собираю запись для IOCCC , что означает, что в отношении моей программы верно следующее:
- Это очень маленькая программа на C в одном файле с именем prog.c
- Я не буду публиковать это здесь, потому что это не поможет (и, вероятно, сделает запись конкурса недействительной)
- Он аккуратно компилируется в gcc, используя "cc -o prog prog.c -Wall "
- Несмотря на (или, точнее, из-за) тот факт, что он содержит кучу действительно странных применений C, он был разработан чрезвычайно тщательно.Я не знаю ни одной его части, которая небрежно относится к памяти (что не означает, что не может быть ошибок, просто если они есть, они вряд ли будут очевидными)
- Я в основном пользователь Windows, но несколько лет назад я успешно скомпилировал и запустил его на нескольких компьютерах с Windows, на нескольких компьютерах Mac и Linux, без проблем.С тех пор код не изменился, но у меня больше нет доступа к этим машинам.
У меня нет машины Linux для повторного тестирования, но в качестве одного последнего теста я попыталсяскомпилировать и запустить его на MacBook Pro - Mac OSX 10.6.7, Xcode 4.2 (т.е. GCC 4.2.1).Опять же, он компилируется чисто из командной строки.Кажется, что на Mac ввод "prog" не заставит скомпилированную программу работать, но, похоже, "open prog".Ничего не происходит в течение примерно 10 секунд (моя программа запускается около минуты, когда она успешна), но затем она просто говорит «Ошибка сегментации» и завершается.
Вот что я пытался отследитьпроблема, использующая ответы, в основном полученные из этого полезного потока StackOverflow :
- В Windows добавили код с помощью _ASSERTE (_CrtCheckMemory ());- Код работал медленно, но успешно.Ни одно из утверждений не сработало (они делают, когда я намеренно добавляю ужасный код, чтобы гарантировать, что _CrtCheckMemory и _ASSERTE работают должным образом, но не иначе)
- На Mac я пробовал Mudflap.Я пытался собрать код, используя варианты "g ++ -fmudflap -fstack-protector-all -lmudflap -Wall -o prog prog.c", который просто выдает ошибку "cc1plus: error: mf-runtime.h: такого файла нетили каталог ".Погугление по этому вопросу не дало ничего убедительного, но, похоже, действительно есть ощущение, что Mudflap просто не работает на Mac.
- Также на Mac я попробовал Valgrind.Я установил и собрал его, и собрал свой код, используя "cc -o prog -g -O0 prog.c".Запуск Valgrind с помощью команды «valgrind --leak-check = yes prog» выдает ошибку «valgrind: prog: команда не найдена».Помня, что вы «открываете» exableable на Mac, я попробовал «valgrind --leak-check = yes open prog», который, кажется, запускает программу, а также запускает Valgrind, который не находит проблем.Тем не менее, Valgrind не может найти проблемы для меня, даже когда я запускаю его с программами, которые специально предназначены для того, чтобы вызывать сообщения об ошибках.Это также не работает на Mac?
- Я попытался запустить программу в XCode со всеми флажками Диагностика, отмеченными в меню Product-> Edit Scheme ..., и с символической точкой останова, установленной в malloc_error_break.Точка останова не срабатывает, код останавливается с помощью стека вызовов, содержащего одну вещь («dlopen»), и единственное примечание, которое отображается в окне вывода, это:
Предупреждение: невозможно восстановить ранее выбранный кадр.Нет доступной памяти для программы: небезопасно вызывать malloc
У меня нет идей.Я пытаюсь настроить Cygwin (хотя это занимает несколько часов), чтобы увидеть, будет ли какой-либо из инструментов работать таким образом, но если это не сработает, то я в растерянности.Наверняка должны быть НЕКОТОРЫЕ инструменты, способные отследить причины ошибок сегментации на Mac?