Почти час убил на проблему на появления «Segmentation fault» при вызове функции gethostbyname(). Перерыл интернет, но ничего полезного для моего случая не нашлось. Надеюсь эта заметка вам пригодится.
Ничто не предвещало беды… 🙂 Была написана небольшая кроссплатформенная утилита, которая по сети обменивалась udp-трафиком. Все замечательно с ней: компилится, работает. Появилась необходимость сделать такую же, только чтобы забирала данные по tcp. Copy-paste, «косметические» правки в коде и программа готова.
Под Виндой компилится, запускается, работает как надо.
Под Линуксом компилится, запускается и выдает «Segmentation fault. Core dumped«. Источник проблемы — в функции gethostbyname(). Но в чем загвоздка — непонятно, ибо параметры передаются те же и так же, как и в udp-версии программы.
strace вернул, что последний вызов перед segmentation fault — munmap(). Но копание интернета и в эту сторону результата, не дало.
Полез смотреть, что вызывается перед этой функцией. Получилось, что gethostbyname() просматривает все системные файлы, относящиеся к разрешению доменных имен и последним открывался /etc/resolv.conf
Мой resolv.conf всегда был пустым, так как не был нужен. ОС предназначена только для отладки программ и всегда хватало пары записей в /etc/hosts для обращения по DNS-именам. Пустой /etc/resolv.conf означает «искать только /etc/hosts».
Так как все идеи как пофиксить segmentation fault закончились, то сделал ход конем: в /etc/resolv.conf добавил одну строчку
И это сработало! Не знаю, что это за шаманство получилось, но теперь программа перестала вываливаться в «Segmentation fault. Core dumped».
Для чистоты эксперимента очистил /etc/resolv.conf — проблема вернулась. С чем это связано так и не понял, потому что код двух программ до вызова gethostbyname() совершенно одинаков.
For english-speaking programmer:
Problem: gethostbyname() cause «Segmentation fault. Core dumped» error on Linux-system.
Solution: I had an empty /etc/resolv.conf in my case. Just add «search localhost» in /etc/resolv.conf to fix «gethostbyname() segmentation fault» problem.
(c) Vor’Chun
адрес этой статьи http://vorchun.ru/comp/prog/gethostbyname-segmentation-fault/
Что еще почитать:
Уведомление: vorchun.ru » Архив блога » http://my-computer.ws – зеркало для псевдо антивируса abustion.ru