Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Прочая документация (http://mangos.ytdb.ru/forumdisplay.php?f=33)
-   -   Crash dump'ы под *nix (http://mangos.ytdb.ru/showthread.php?t=225)

CruncH 11.03.2010 13:09

Crash dump'ы под *nix
 
Вложений: 1
Создаю тему из сохраненных ранее страниц, оригинальное название "Crash dump'ы под Linux".
Автор оригинальной темы mentat.
Содержание почти полностью переделано.
Выкладываю во вложениях 3 из 4 страницы(одной страницы нет т.к. там был просто флуд и никакой смысловой нагрузки он не нес).

Нам понадобится:
  1. Отладчик gdb
  2. *nix система
  3. руки и мозг(опционально, но желательно все таки их наличие :) )
*Заметка: для удобной отладки нужно чтобы мангос был собран с опцией "--with-debug-info", иначе не будет достаточной информации о причине падения сервера. Также для избежание неприятных ситуаций рекомендуется иметь хороший запас места на жестком диске.
Цитата:

Установка gdb происходит также как и любой другое программное обеспечение в системе, а именно через системы: emerge - Gentoo, aptitude(apt-get, etc) - Deb системы(Debian, Ubuntu, etc), zypper или yum - rpm системы(Opensuse,Fedora)
*В openSuse для этого можно воспользоваться yast'том(YaST2 - universal configuration utility), как GUI версией, так и консольной на ncurses с псевдографикой

И так начнем...
Для отладки Mangos под *nix нужно:

Linux:
1)Включаем генерацию дампов на текущую сессию
Код:

ulimit -c unlimited
и/или в файл /etc/security/limits.conf добавить
Код:

* hard core unlimited
*заметка: я бы так не советовал делать лишь по 1 причине, после этого на все сессии будет распространятся создание коре дапов при падениях приложений , и на харде будет постепенно собираться мусор. На мой взгляд гораздо правильней сделать 1 способом и использовать эту команду либо в скрипте запуска, либо напрямую в консоли.
2)
2.1) Прежде чем редактировать файл /etc/sysctl.conf нужно определить точные имена некоторых переменных
в консоли:
Код:

cat /proc/sys/fs/suid_dumpable
Ответ должен быть в виде 0 "нуля" и значить файл существует. если не существует такого файла то пробуем:
Код:

cat /proc/sys/kernel/suid_dumpable
Ответ должен быть таким же, как и ожидался ранее.
*заметка: В большинстве систем обычно первый файл присутствует
2.2) Создаем папку и ставим права доступа 777
Код:

mkdir -p /var/log/dumps
chmod -R 777 /var/log/dumps

2.3) Приступаем к редактированию файла /etc/sysctl.conf
Добавляем в конец файла строчки(!!!в место "[define]" вставляем то выделенное слово, из предыдущего действия, где файл имелся в наличии и возвращался какой либо результат!!!):
Код:

[define].suid_dumpable=2
kernel.core_pattern="/var/log/dumps/%e.%p.core"

Эти параметры будут действовать после перезагрузки системы, для мгновенного результата можно выполнить 2 команды
Код:

sysctl -w [define].suid_dumpable=2
sysctl -w kernel.core_pattern="/var/log/dumps/core.%e.%p"

*заметка: для того чтобы узнать более подробно о %e и %p смотрим man core

Теперь дампы будут ложиться в папку /var/log/dumps/

*BSD:
***под бсд системами это не проверялось, то есть это переделанный копипаст***
1)Должна быть включена опция в ядре:
Код:

makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
2) в файле /etc/sysctl.conf добавляем следующие строки:
Код:

kern.coredump=1
kern.corefile=/home/cores/%U.%N.core

Чтобы изменения применились сразу выполняем следующие команды:
Код:

sysctl -w kern.coredump=1
sysctl -w kern.corefile=/home/cores/%U.%N.core

При этом - директория /home/cores/ должна существовать и на нее должны стоять соответствующие права для возможности записи туда файлов.

Работа с отладчиком GDB:
2) Создать файл(создать можно где душе угодно, лишь бы было бы удобно) bt с содержанием
Код:

bt full
*заметка: для более полной информации о командах отладчика нужно смотреть man gdb
смотрим коре дамп в отладчике
Код:

gdb /path/to/mangos-worldd -c /path/to/[имя файла дампа].core -n --command=/path/to/bt
для вывода данных в файл можно воспользоваться таким способом
Код:

gdb /path/to/mangos-worldd -c /path/to/[имя файла дампа].core -n --batch --command=/path/to/bt >> dump.log
*заметка: в зависимости от содержания файла bt будет зависеть вывод информации о дампе

Ресурсы с которых бралась информация:
1) _http://linux.die.net/man/5/core также можно это глянуть через man core
2) _http://www.randombugs.com/linux/core-dumps-linux.html
использовалась система OpenSuse11.2(2.6.31.5-0.1-default)

CruncH 11.03.2010 22:05

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

anemak 15.03.2010 22:52

Рекомендую к прочтению
Код:

http://getmangos.com/community/showthread.php?4579-%5BHOWTO%5D-GDB-Debugging

muraig 18.03.2010 04:24

Core.damp
 
Цитата:

Сообщение от CruncH (Сообщение 1333)
Создаю тему из сохраненных ранее страниц, оригинальное название "Crash dump'ы под Linux".
Автор оригинальной темы mentat.
Содержание почти полностью переделанно.
Выкладываю во вложениях 3 из 4 страницы(одной страницы нет т.к. там был просто флуд и никакой смысловой нагрузки он не нес).

при включении опции
Код:

--with-debug-info
исполняемые файлы могут достигать намного больших размеров:


когда все это падает в корку - на винте должно быть не менее ~500 Mb свободного места..учтите это, а то я систему колом поставил, когда неожиданно организовал пару "корок" :)
при сборке с опцией
Код:

--with-debug-info
есть еще один ньюанс - в процессе сборки необходимо иметь до 4Gb свободного места..именно до такого размера может вырасти папочка, в которой компилиться проект :)

CruncH 18.03.2010 09:18

muraig, то что корки могут весить очень много(размер равен ~занимаемоей памяти в озу), я это знаю. Там не так место на диске нужно будет, как скорость записи этой корки на жесткий диск. Так как пока корка не сольется на жесткий, "авторестартер" не запустит новый процесс ядра.

muraig 19.03.2010 20:50

Core.damp
 
Цитата:

Сообщение от CruncH (Сообщение 2534)
muraig, то что корки могут весить очень много(размер равен ~занимаемоей памяти в озу), я это знаю. Там не так место на диске нужно будет, как скорость записи этой корки на жесткий диск. Так как пока корка не сольется на жесткий, "авторестартер" не запустит новый процесс ядра.

этой информацией я еще не знал )

зато собрал портом
Код:

MaNGOS/0.16.0 (* * Revision 9592 - *) for FreeBSD_x64 (little-endian) [world-daemon]
 Loading ScriptDev2 (for MaNGOS 9444+).

сейчас причешу его и выложу для экспериментов :)
Код:

gmake[1]: Leaving directory `/usr/local/MaNGOS/Posrts/mangos/work/mangos-9592/objdir'
===>  Running ldconfig
/sbin/ldconfig -m /usr/local/lib
===>  Registering installation for mangos-9592

вот так вот выглядят последние строчки make install :)
двое суток сидел, разбирался с опциями вот так вроде получается:

еще нужно сделать интерактивный выбор названия исполняемого файла(если серверов более двух - могут возникнуть проблемы с гашением процессов) и еще есть мулька - перевести на PostgreSQL базу

selector 03.05.2010 15:16

Могу посоветовать отличную программку для авторестарта/отладки процесса сервера. Название - restartd
http://packages.ubuntu.com/ru/jaunty/restartd - для Убунту.
Для остальных систем можно поискать в гугле.

Скачиваем, устанавливаем, в файле конфига (/etc/restartd.conf) прописываем после объяснений нечто вида:
Код:

# Restartd configuration file

# Format:
#
# <process_name> <regexp> <action_if_not_running> <action_if_running>
#
# process_name: the name of the process which is just for logging
# as it does not affect for the regexp
#
# regexp: the POSIX regular expression for the command line of the
# process
#
# action_if_not_running: a script or program name to execute if the
# regexp does not match the full process command line
#
# action_if_running: a script or program name to execute if the regexp
# matches the full process command line

# Example:
#
# restartd ".*restartd" "/bin/echo 'It is not running!' >/tmp/restartd.out" "/bin/echo 'It is running!' >/tmp/restartd.out"

wotlk "mangos-wotlk" "ulimit -c unlimited; /opt/war/bin/mangos-worldd > /dev/null 2>&1 &" ""

wotlk "mangos-wotlk" - по желанию, как вы хотите назвать процесс

/opt/war/bin/mangos-worldd - путь куда вы установили сервер

Креш дампы будут складироваться в Корне "/" и будут иметь вид "core.xxxx"(где хххх - номер процесса когда мангос работал). Прочитать дамп вполне просто. В консоле вводим:
gdb /opt/war/bin/mangos-worldd -c /core.xxxx

далее bt либо bt full


Может быть это кому-то поможет.

Внимание для прочтения дампов вам потребуется пакет gdb который можно скачать командой apt-get install gdb(yum install gdb для Федоры).

-----------------------
Добавлено:

Запуск программы restartd можно осуществить выполнив команду ./usr/sbin/restartd (Для убунту) либо (./sbin/restartd для Федоры). Отключить программу просто - убить процесс с помощью kill id_процесса. Также возможно ее поставить как службу включив ее в /etc/init.d после этого старт/рестарт/остановка возможны командами service restartd start|restart|stop

lina 10.05.2010 20:52

на счет первого поста (2.3) не понятно.

/proc/sys/fs/suid_dumpable.suid_dumpable=2
kernel.core_pattern="/var/log/dumps/%e.%p.core"

правильно ?
если да, то при перезагрузки sysctl лезут ошибки

CruncH 10.05.2010 21:06

Цитата:

Сообщение от lina (Сообщение 6088)
на счет первого поста (2.3) не понятно.

/proc/sys/fs/suid_dumpable.suid_dumpable=2
kernel.core_pattern="/var/log/dumps/%e.%p.core"

правильно ?
если да, то при перезагрузки sysctl лезут ошибки

fs.suid_dumpable=2
Чуть внимательнее нада было...


PS: выделю тот пункт чуть лучше...

lina 10.05.2010 21:13

Цитата:

Сообщение от CruncH (Сообщение 6092)
fs.suid_dumpable=2
Чуть внимательнее нада было...


PS: выделю тот пункт чуть лучше...

спасибо) читал пару раз не заметил что выделенное слово было )

BonDit 15.05.2010 12:34

Цитата:

Сообщение от CruncH (Сообщение 1333)
Код:

kern.corefile=/home/cores/%U.%N.core
Чтобы изменения применились сразу выполняем следующие команды:
Код:

sysctl -w kern.corefile=/home/cores/%U.%N.core

Лучше сделать
Код:

kern.corefile=/home/cores/%P.%N.core
иначе дамп перезаписывается.

lina 20.05.2010 18:49

у меня вообще все кроме крашей сервера туда сбрасывается
например вылетел rar, кор файл создался показал bt
вылетел мангос, ничего не создаётся.
возможно это из за Скрина ?

CruncH 20.05.2010 20:23

lina, нада смотреть скрипт который запускает mangos, и туда прописывать ulimit(я думаю в твоем случае screen запускает скрипт, который выполняет роль авторестартера, вот в него и нужно дописать ulimit), а разрешать делать дампы на всю систему неправильно, много мусора будет.

BonDit, ну я там еще с самого начала сделал сноску(там где еще для линя настройки идут) "смотри man core", фряхи под рукой нету, так что сказать ничего не могу как там точно. Тут есть + =) коре дампы не будут захламлять винт, а то иногда они достаточно тяжелые бывают.

Creed 07.08.2010 21:43

Сделал логи по описанию в 1м посте.
В дирекции папки: /var/log/dumps/ создаются нужные логи, например: mangos-worldd.1281186816.1878.core
Но их вес составляет 600-800 Мб. При этом сервер более 4х часов не работал. В чём может быть проблема?

tempura 07.08.2010 23:21

Цитата:

Сообщение от Creed (Сообщение 12217)
В дирекции папки...

Пять баллов. :)


По теме - например я (ни линуксоид не близко) подозреваю, что это полный дамп ядра на момент краша. :)

Может быть вам стоит использовать проприетарную, и более дружелюбную к пользователям, операционную систему? :)

rsa 09.08.2010 06:56

Цитата:

Сообщение от tempura (Сообщение 12220)
Пять баллов. :)


По теме - например я (ни линуксоид не близко) подозреваю, что это полный дамп ядра на момент краша. :)

Может быть вам стоит использовать проприетарную, и более дружелюбную к пользователям, операционную систему? :)


KaraPUZ 21.08.2010 11:09

Цитата:

Сообщение от selector (Сообщение 5489)
Могу посоветовать отличную программку для авторестарта/отладки процесса сервера. Название - restartd
http://packages.ubuntu.com/ru/jaunty/restartd - для Убунту.
Для остальных систем можно поискать в гугле.

Скачиваем, устанавливаем, в файле конфига (/etc/restartd.conf) прописываем после объяснений нечто вида:
Код:

# Restartd configuration file

# Format:
#
# <process_name> <regexp> <action_if_not_running> <action_if_running>
#
# process_name: the name of the process which is just for logging
# as it does not affect for the regexp
#
# regexp: the POSIX regular expression for the command line of the
# process
#
# action_if_not_running: a script or program name to execute if the
# regexp does not match the full process command line
#
# action_if_running: a script or program name to execute if the regexp
# matches the full process command line

# Example:
#
# restartd ".*restartd" "/bin/echo 'It is not running!' >/tmp/restartd.out" "/bin/echo 'It is running!' >/tmp/restartd.out"

wotlk "mangos-wotlk" "ulimit -c unlimited; /opt/war/bin/mangos-worldd > /dev/null 2>&1 &" ""

wotlk "mangos-wotlk" - по желанию, как вы хотите назвать процесс

/opt/war/bin/mangos-worldd - путь куда вы установили сервер

Креш дампы будут складироваться в Корне "/" и будут иметь вид "core.xxxx"(где хххх - номер процесса когда мангос работал). Прочитать дамп вполне просто. В консоле вводим:
gdb /opt/war/bin/mangos-worldd -c /core.xxxx

далее bt либо bt full


Может быть это кому-то поможет.

Внимание для прочтения дампов вам потребуется пакет gdb который можно скачать командой apt-get install gdb(yum install gdb для Федоры).

-----------------------
Добавлено:

Запуск программы restartd можно осуществить выполнив команду ./usr/sbin/restartd (Для убунту) либо (./sbin/restartd для Федоры). Отключить программу просто - убить процесс с помощью kill id_процесса. Также возможно ее поставить как службу включив ее в /etc/init.d после этого старт/рестарт/остановка возможны командами service restartd start|restart|stop

Кто пробовал работать с этим пакетом ? Можно ли изменить пусть создания дампов ?

Цитата:

lina, нада смотреть скрипт который запускает mangos, и туда прописывать ulimit(я думаю в твоем случае screen запускает скрипт, который выполняет роль авторестартера, вот в него и нужно дописать ulimit), а разрешать делать дампы на всю систему неправильно, много мусора будет.
И где с рестартере мангоса на до менять на ulimit,если мой рестартер имеет такое содержание:
Код:

#!/bin/sh
while true ; do
servlog='/home/mangos/bin/Server.log';
outpatch='/home/mangos/bin/crash/';
date=`date "+%Y-%m-%d_%H:%M:%S"`;
echo "Server CRASHED !!! Start Bugreport System." >> $outpatch$date.txt;
echo "Server.log Log FILE Last 30 Lines:" >> $outpatch$date.txt;
cat $servlog | tail -n 30 >> $outpatch$date.txt;
echo "" >> $outpatch$date.txt;
echo "END bugtracker system." >> $outpatch$date.txt;
/home/mangos/bin/mangos-worldd
done



Текущее время: 06:44. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS