Всем привет!
В один "прекрасный" день обнаружил, что на одном из серверов FreeBSD 10.1 не запускаются задания по крону. Посмотрел, оказалось - сам cron не запущен. Стартовал:
service cron start
Получил segmentation fault. В логах ничего более толкового нет.
Добавил отладочные параметры для cronа: -x bit,ext,load,misc,pars,proc,sch
Стартую - после портянки вывода отладочной информации тот же segmentation fault, причем в отладочной информации никаких намеков на ошибки.
Закоментировал в crontab все задания, стартовал - то же самое.
Собрал cron с отладочной информацией, запускаю под gdb - работает. Восстановил в crontab задания - выполняются. Т.е. ошибку под отладчиком выявить не могу.
Куда дальше копнуть? Не могу я его все время под отладчиком держать.
PS: пользовательских файлов crontab в системе нет.
Не ясно так же почему он начал падать. С момента, когда он упал впервые никаких апгрейдов системы не было, из правок конфигов были только незначительные правки sendmail и ipfw. Все задания, которые висят в crontab работают уже несколько лет, аналогичные задания и на других серверах.
Разобрался. cron обращался к системной функции getpwnam, а т.к. у меня пользователи беруться с ldap каталога по ssl, то этот вызов генерил запрос библиотеки openssl.
Оказалось в системе стояло 2 версии openssl из мира и из портов. Один из вызовов к openssl проходил к одной версии, второй - к другой и, видимо, что-то в этом месте не нравилось системе :)
Оставил версию openssl из портов и cron поднялся как родной.
А если запустить с отладочной информацией но без отладчика -- падает?
В этой вашей BSD есть core-дампы? Если есть -- пусть сгенерирует, загрузите его в gdb и посмотрите.
С отладочной информацией запускал без отладчика - падает.
Дампы есть, создаются автоматически.
В gdb после загрузки дампа:
Program terminated with signal 11, Segmentation fault.
#0 0x0000000802a1a0e5 in ?? ()
Что с этой информацией делать, честно говоря не знаю.
Адрес - видимо адрес функции, на которой падает, но раз он без расшифровки, то скорее всего это адрес системной функции. Как узнать какой именно?
Информация о сигнале, то же особо ни о чем не говорит.
> Что с этой информацией делать, честно говоря не знаю.
что выдают следующие команды в gdb:
bt
info sharedlibrary
> это адрес системной функции. Как узнать какой именно?
я опять же хз как это в BSD, а в линуксе можно поставить пакеты с отладочной информацией для системных либ.
Накопал немного. Обошлось без отладки системных либ.
Рушится на вызове getpwnam(username), при этом username - указывает в никуда. Хотя выше по коду идет
char *username = cmd;
При этом cmd нормально определено и имеет корректное значение "root". Больше по коду присваивания username нет нигде. Полтергейст?