![]() |
![]() |
|
||
![]() |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [17 сентября 2003 г.] |
|
|
Если ну совсем уж ничего не получается, прочти, наконец, инструкцию! Народная мудрость. |
Набла была написана, т.к. по данному конкретному вопросу в Интернете довольно мало практических рекомендаций. Имеется лишь море теории и огромные залежи документации, а практических советов почти нет. К сожалению, это частый случай в мире Unix.
|
Что вы делаете, когда в Windows возникает окно «Программа выполнила недопустимую операцию и будет закрыта»? Тихо материтесь и запускаете ее опять. А что, если
Что же делать, если вдруг начал «падать» один из серверов в Unix и «обычные» средства не помогают?..
Ехал «новый русский», и вдруг у него сломалась машина. Остановился он, смотрит, как баран на новые ворота. Мимо проезжает второй «кореш», останавливается. Что, братан, машина сломалась? Ага... Э, друг, да тебе повезло, я в этом деле спец! Правда?.. И что делать? Ну, ты ногой по баллону постучи. Уже стучал, не помогает. Ну, а стекло ветровое протирал? Протирал. Ну, блин... Тогда я не знаю... |
Между тем, есть реальный шанс все поправить, и, как ни странно, это не так уж и сложно. Как всегда, шанс дан только тем, кто хорошо знает Си, остальные могут даже и не
Для простоты предположим, что мы имеем дело с Apache (в
Прежде, чем рвать на себе волосы, внимательно посмотрите, что пишется в логах сервера. Убедитесь, что Apache действительно «падает» и при этом создается core-файл. Вам следует точно определиться, необходимо ли пользоваться советами, приведенными далее, или же удастся без них обойтись. Незачем стрелять из пушки по воробьям. |
Вначале надо убедиться, что сервер собран из исходников. (Если он был установлен уже откомпилированным, то вам в морг, в морг.) Когда кто-то хочет выжать максимальную надежность из той или иной программы в Unix, он компилирует ее вручную. Во-первых, так доступно больше возможностей по настройке. Во-вторых, всегда можно поправить то, что не
Далее идет очень важный момент. Убедитесь, что вы собираете программу со включенной отладочной информацией. Это несколько увеличивает размер исполняемых файлов, зато позволяет определить, что произошло с зависшим или упавшим сервером, не прибегая к помощи чукотского шамана.
Для включения отладочного режима существует ключ
| Листинг 1 |
## ## Apache Makefile, automatically generated by ## Configure script. Hand-edited changes will be ## lost if the Configure script is re-run. ## Sources: - ./Makefile.config (via Configuration.apaci) ## - ./Makefile.tmpl ## я тут пропустил пару строк ## ## Inherited Makefile options from Configure script ## (Begin of automatically generated section) ## SRCDIR=. EXTRA_CFLAGS=-DRECORD_FORWARD `\$(SRCDIR)/apaci` EXTRA_LDFLAGS= |
Видите переменную
Но подождите править! Прочтите же то, что написано сверху. А там говорится, что при следующем запуске
Вкратце, чтобы сконфигурировать Apache (да и большинство других программ, в исходниках которых есть скрипт
(CFLAGS='-g'; export CFLAGS; ./configure параметры)
Обязательно используйте скобки (так, как написано выше), иначе переменная |
Потом, как обычно,
Дальше начинается самое интересное. Будем считать, что у нас «глючит» Apache, установленный в директорию
Устанавливаем отладчик GNU Debugger (в
Подробная документация GDB на русском языке есть по адресу http://www.opennet.ru/docs/RUS/gdb/gdb_toc.html. |
Вначале останавливаем сервер (иначе
| Листинг 2 |
directory /usr/src/apache/src directory /usr/src/apache/src/modules directory /usr/src/apache/src/modules/standard directory /usr/src/apache/src/modules/extra |
В общем, чем больше там директорий, тем лучше. Ну а дальше запускаем команду:
| Листинг 3 |
gdb -x gdb.cmd ./bin/httpd ./core |
Это заставляет GDB исследовать файл
GDB автоматически останавливается в том месте, где произошла ошибка и был создан файл
Чтобы показать исходный код программы в текущем месте, набираем
Если нас интересует значение какой-нибудь переменной (локальной или глобальной) в программе, мы можем его вывести при помощи команды
Наконец, можно «путешествовать» по дереву вызовов функций, делая текущей то одну, то другую. Для этого существуют, соответственно, команды
Для выхода из отладчика введите команду
Теперь, когда вы поняли, что не так все и сложно, буду краток. Если некоторый сервер «завис», вы можете посмотреть, в каком месте программы он в данный момент «крутится». Для этого используется команда:
| Листинг 4 |
gdb bin/httpd 1234 |
Здесь
Подробности, а также описание других полезных команд, читайте в документации GDB или по адресу http://www.opennet.ru/docs/RUS/gdb/gdb_toc.html. |
Если однажды GDB по команде
| Листинг 5 |
find /usr/src/apache -name Makefile |
# http://www.opennet.ru/docs/RUS/gdb/gdb_toc.html
BIN=bin/httpd
ROOT=/usr/src/apache
CONFIG=gdb.cnf.auto
find $ROOT -name Makefile \
-printf "directory %h\n" > $CONFIG
gdb -x $CONFIG $BIN core
rm -f $CONFIG
![]() |
| ||||||||||||||||||||||||
| Дмитрий Котеров | 17 сентября 2003 г. ©1999-2010 | | Контакт | Вернуться к оглавлению |