Коды ошибок crashinfo.txt - Расшифровка -
DANGER1979 - 17.08.2010
Всем покажется глупая тема, но я думаю, что может кому-то что-то и поможет, а кто-нибудь поддержит эту глупую на первый взгляд тему.
Итак, у вас крашанул сервер и вы хотите узнать причину. Заходим в crashinfo.txt, который находится рядом с samp-server.exe. Видим вот такую ошибку.
Code:
--------------------------
SA-MP Server: 0.3a R8
Exception At Address: 0x004033BF
Registers:
EAX: 0x00000003 EBX: 0x0000000E ECX: 0x00D83814 EDX: 0x00000047
ESI: 0x00000047 EDI: 0x0012F628 EBP: 0x0012F628 ESP: 0x0012F5A0
EFLAGS: 0x00010202
Stack:
+0000: 0x027161D8 0x00000047 0x0000000E 0x00460511
+0010: 0x0012F628 0x00000047 0x00000000 0x0000000E
+0020: 0x027161D8 0x0012F5FC 0x00000020 0x027161D8
+0030: 0x00000047 0x027161D8 0x0012F600 0x0012F608
+0040: 0x0012F628 0x00000000 0x00000000 0x02716B08
+0050: 0x0012F850 0x03EE9348 0x00000047 0x00000001
+0060: 0x004707BD 0x0047D5A8 0x00000047 0x00000020
+0070: 0x0012F85C 0x01C16B50 0x3F100601 0x01C16B50
+0080: 0x0012F80D 0x027161D8 0xEBE8EAF1 0xE0EA20EB
+0090: 0x20E9EEEA 0x0000003F 0x00000000 0x00000000
+00A0: 0x00000000 0x00000000 0x00000000 0x00000000
+00B0: 0x00000000 0x00000000 0x00000000 0x00000000
+00C0: 0x00000000 0x00000000 0x00000000 0x00000000
+00D0: 0x00000000 0x00000000 0x00000000 0x00000000
+00E0: 0x00000000 0x00000000 0x00000000 0x00000000
+00F0: 0x00000000 0x00000000 0x00000000 0x00000000
+0100: 0x00000000 0x00000000 0x00000000 0x00000000
+0110: 0x00000000 0x00000000 0x00000000 0x00000000
+0120: 0x00000000 0x00000000 0x00000000 0x00000000
+0130: 0x00000000 0x00000000 0x00000000 0x00000000
Все ошибки будем классифицировать по этой строке
PHP Code:
Exception At Address: 0x004033BF
Данная ошибка встречается со времен 0.2 сампа. Зачастую крашит сервер при выпадении значения из диапазона значений в цыкле или в таймере, т.е. пример
pawn Code:
if(velocity < 60)
{
...
}
if(velocity>60 && velocity<=90)
{
...
}
if(velocity>90)
{
...
}
Не трудно догадаться при каком значении velocity крашанёт сервер. Хотя такую ошибку могут совершить и опытные скриптеры.
Продолжение следует.
Re: Коды ошибок crashinfo.txt - Расшифровка -
^Woozie^ - 17.08.2010
при каких значениях, я слишком тупой и не догадался, расскажите мне!
Re: Коды ошибок crashinfo.txt - Расшифровка -
Stepashka - 17.08.2010
В упор не вижу выпадающего значения из диапазона, а то что 60 не юзается дак это может специально так сделано.
А то что из-за выпавшего значения падает сервер это ваще ахинея

Я иногда десятки значений специально пропускаю, например:
pawn Code:
for(new playerid;playerid < MAX_PLAYERS;playerid++){
if(!IsPlayerConnected(playerid))continue;
...
}
при онлайне в 40 человек, цикл пропускает 460 значений, ты утверждаешь что сервак при этом должен упасть?
Re: Коды ошибок crashinfo.txt - Расшифровка -
DANGER1979 - 17.08.2010
Я утверждаю, т.к. сам с этой ошибкой долго боролся. Естественно при 60 будет падать сервер, но я не расписывал весь дальнейший код, а написал именно то место где была ошибка.
Естественно если не обрабатывать velocity = 60 то сервер не упадет, но если дальше в коде идёт обработка каждого значения, то сервер у меня крашил и это факт. Тут я ни чего не придумываю.
Кстати ты привел не совсем удачный пример, т.к. у тебя все, что не попадает в цыкл не обрабатывается согласно оператору continue.
Re: Коды ошибок crashinfo.txt - Расшифровка -
Stepashka - 17.08.2010
Твой код и не обрабатывает значение 60 он его просто игнорирует и движется дальше!
Бред написан, от того что ты пропустил какое-то значение сервер не упадет, ищи ошубку в другом месте!
В твоем случае идет просто игонориование, которое может являться как случайным так и запрограмированным.
Re: Коды ошибок crashinfo.txt - Расшифровка -
DANGER1979 - 17.08.2010
Да уже нашёл сто лет назад ошибку и написал вверху где именно. Для тебя эта тема я думаю бесполезная.
Я привел только одну ошибку из своих наблюдений. Приведи свои наблюдения в таком случаи.
В инете я вобще не видел, чтобы кто-то по этим ошибкам делал какой то анализ. Для большинства людей этот текстовый файл просто файл загадка. Вот я и решил обсудить этот файл.
Re: Коды ошибок crashinfo.txt - Расшифровка -
dimonml - 17.08.2010
Quote:
Originally Posted by DANGER1979
Все ошибки будем классифицировать по этой строке
PHP Code:
Exception At Address: 0x004033BF
|
Конечно число 60 это хорошо, но
адреса возникновения ошибки будут меняться от компиляции сервера, так что в общем случае, в каждом релизе сервера будут свои + разные для линукса и виндоуса, так что действительно считаю тему ненужной
Re: Коды ошибок crashinfo.txt - Расшифровка -
Aleks10 - 18.08.2010
да, действительно бред насчёт выпадения числа 60...
Re: Коды ошибок crashinfo.txt - Расшифровка -
MX_Master - 18.08.2010
я думаю, что обратить внимание нужно не на "Exception At Address: 0xХХХХХХХХ", а на подробности ниже. Я к примеру понятия не имею, что означают эти EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EFLAGS ..
Re: Коды ошибок crashinfo.txt - Расшифровка -
dimonml - 18.08.2010
Quote:
Originally Posted by MX_Master
Я к примеру понятия не имею, что означают эти ..
|
Очень грубо говоря, процессор семейства х86 исполняет команды, которые находятся в оперативной памяти компьютера. Поскольку ЦП работает сильно быстрей оперативной памяти у него есть еще своя быстрая память (статическая) - регистры (те самые EAX, EBX, ECX, EDX, ESI, ...). Процессор умеет выполнять определенные операции с памятью и регистрами (как правило операций с регистрами больше и чтобы что-то выполнить вначале нужно поместить данные в регистр, а после выполнения операции положить результат в память). Описанное выше фактически относиться к любым процессорам общего назначения. Особенность x86 заключается в том, что у него есть аппаратная поддержка стека (есть специальный регистр - указатель стека ESP и есть специальные команды по работе со стеком (pop, push, call, ret и прочее). Есть ли у процессора аппаратный стек или нет, но стек обычно используется компиляторами языков высокого уровня для хранения локальных переменных функций, и организации вызова функций (возможная передача аргументов, указания адреса возврата из функции)
Также есть специальные регистр - EIP - он указывает на адрес памяти, по которому выполняется текущая инструкция.
В результате Exception At Address: 0xXXXXXXXX - это адрес инструкции, которая вызвала ошибку (значение регистра EIP в момент генерации исключения), EAX, EBX, ECX, EDX, ESI, ... - регистры общего назначения в момент исключения. Stack: - Значение стека в момент исключения.
По стеку можно понять значения локальных переменных функции и попытаться понять историю вызова (в сампе без особых усилий можно узнать историю вызова функций только под линуксом, так как Кай компилирует сервер без включения опции "omit frame pointer", под виндоусом историю вызова придется искать анализируя дизассемблерный код сервера. Это все верно, конечно, если нет отладочной информации).
В результате, понять crashinfo.txt можно только имея представления об аппаратной архитектуре семейства процессоров х86 и хотя бы приближенном знании ассемблера этой архитектуры. Но самый прикол в том, что в этом файле все равно очень мало информации (в crashinfo.txt даже нет номера исключения). В линуксе, например, можно настроить ядро таким образом, чтобы в случае ошибки приложения, оно не просто убивалось, а перед этим в crash dump записывалось полное состояние процесса в момент генерации исключения. К такому crash dump можно подключиться отладчиком (gdb) и иметь возможно анализировать все приложение (все память, стек, регистры).