Коды ошибок crashinfo.txt - Расшифровка
#1

Всем покажется глупая тема, но я думаю, что может кому-то что-то и поможет, а кто-нибудь поддержит эту глупую на первый взгляд тему.

Итак, у вас крашанул сервер и вы хотите узнать причину. Заходим в 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 Address0x004033BF 
Данная ошибка встречается со времен 0.2 сампа. Зачастую крашит сервер при выпадении значения из диапазона значений в цыкле или в таймере, т.е. пример
pawn Code:
if(velocity < 60)
{
...
}
if(velocity>60 && velocity<=90)
{
...
}
if(velocity>90)
{
...
}
Не трудно догадаться при каком значении velocity крашанёт сервер. Хотя такую ошибку могут совершить и опытные скриптеры.

Продолжение следует.
Reply
#2

при каких значениях, я слишком тупой и не догадался, расскажите мне!
Reply
#3

В упор не вижу выпадающего значения из диапазона, а то что 60 не юзается дак это может специально так сделано.
А то что из-за выпавшего значения падает сервер это ваще ахинея
Я иногда десятки значений специально пропускаю, например:
pawn Code:
for(new playerid;playerid < MAX_PLAYERS;playerid++){
if(!IsPlayerConnected(playerid))continue;
...
}
при онлайне в 40 человек, цикл пропускает 460 значений, ты утверждаешь что сервак при этом должен упасть?
Reply
#4

Я утверждаю, т.к. сам с этой ошибкой долго боролся. Естественно при 60 будет падать сервер, но я не расписывал весь дальнейший код, а написал именно то место где была ошибка.

Естественно если не обрабатывать velocity = 60 то сервер не упадет, но если дальше в коде идёт обработка каждого значения, то сервер у меня крашил и это факт. Тут я ни чего не придумываю.

Кстати ты привел не совсем удачный пример, т.к. у тебя все, что не попадает в цыкл не обрабатывается согласно оператору continue.
Reply
#5

Твой код и не обрабатывает значение 60 он его просто игнорирует и движется дальше!
Бред написан, от того что ты пропустил какое-то значение сервер не упадет, ищи ошубку в другом месте!

В твоем случае идет просто игонориование, которое может являться как случайным так и запрограмированным.
Reply
#6

Да уже нашёл сто лет назад ошибку и написал вверху где именно. Для тебя эта тема я думаю бесполезная.
Я привел только одну ошибку из своих наблюдений. Приведи свои наблюдения в таком случаи.
В инете я вобще не видел, чтобы кто-то по этим ошибкам делал какой то анализ. Для большинства людей этот текстовый файл просто файл загадка. Вот я и решил обсудить этот файл.
Reply
#7

Quote:
Originally Posted by DANGER1979
View Post
Все ошибки будем классифицировать по этой строке
PHP Code:
Exception At Address0x004033BF 
Конечно число 60 это хорошо, но адреса возникновения ошибки будут меняться от компиляции сервера, так что в общем случае, в каждом релизе сервера будут свои + разные для линукса и виндоуса, так что действительно считаю тему ненужной
Reply
#8

да, действительно бред насчёт выпадения числа 60...
Reply
#9

я думаю, что обратить внимание нужно не на "Exception At Address: 0xХХХХХХХХ", а на подробности ниже. Я к примеру понятия не имею, что означают эти EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EFLAGS ..
Reply
#10

Quote:
Originally Posted by MX_Master
View Post
Я к примеру понятия не имею, что означают эти ..
Очень грубо говоря, процессор семейства х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) и иметь возможно анализировать все приложение (все память, стек, регистры).
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)