программа запускается при запуске make, но не через shell - сумасшедшая чепуха! - PullRequest
1 голос
/ 19 марта 2009

Я написал программу на C, в которой я сделал довольно тяжелое выделение стека, около 2 МБ. Поскольку я использую IDE для бедняков *, я автоматически запускал программу через make, чтобы проверить ее каждый раз, когда компилировал.

Я почти все обернул, но по какой-то причине во время окончательной оптимизации я запустил его прямо из оболочки. Мгновенный сегменто! Запуск с make все еще работал, а запуск вручную всегда приводил к одному и тому же segfault.

Я в конечном итоге уменьшил объем выделяемого стека до 256 КиБ, что решило проблему. Моим разумным предположением было то, что make, вероятно, выполнял процесс, и, таким образом, он наследовал некоторые странные параметры, которые позволяли ему использовать больше места в стеке.

Хотя сейчас все в порядке, у меня нет возможности проверить свою теорию. Кто-нибудь может подтвердить или опровергнуть или предложить какой-либо способ тестирования?

* zsh, vim, gcc, gdb и некоторые сумасшедшие make-файлы

Ответы [ 3 ]

5 голосов
/ 19 марта 2009

Вы можете попробовать установить максимальный размер стека с помощью ulimit (1) и посмотреть, работает ли он:

# Limit stack to 1024 KiB
ulimit -s 1024; ./myprogram
# Now no limit
ulimit -s unlimited; ./myprogram
1 голос
/ 19 марта 2009

Лично я первым делом попытался бы определить, где в коде произошла ошибка, либо с помощью gdb, либо с отладкой printf s или чем-то еще. (Вот почему вы всегда проверяете возвращаемые значения из malloc, это сокращает возможные источники segfaults ;-p) Во-первых, поиск точного источника проблемы может дать вам подтверждение или против вашей теории о распределении стека; кроме того, он позволит вам вставить код проверки ошибок, чтобы программа могла корректно завершать работу с информативным сообщением об ошибке, а не с ошибками.

0 голосов
/ 19 марта 2009

Для диагностики требуется дополнительная информация. А именно, было бы неплохо увидеть make-файл и сценарии оболочки, которые вы использовали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...