CRASH: Вс июн 21 12:06:36 MSK 2020Значит сервер не упал. Его кто-то намеренно выключил мирным путём.
подскажи плиз что делать то , на сервачке сервер. падает. создается только файлик в папке oldstartНа Арене любой шатдаун не из их панели считается за краш. Ну это так, к сведению.
даИли имеешь ввиду как работать с данными?
+app_update 740 validate
не помоглоCRASH: Пт фев 26 12:13:39 MSK 2021
Start Line: ./srcds_linux -game csgo -console -debug -usercon -secure -autoupdate -steam_dir /home/server2000/steamcmd -steamcmd_script /home/server2000/steamcmd/runscript_server2000 -maxplayers_override 25 -tickrate 128 +ip 192.168.1.136 +net_public_adr ***.**.**.** -port 27015 +tv_port 37015 +sv_pure 0 +game_type 0 +game_mode 0 +map 000
[New LWP 12628]
[New LWP 12639]
[New LWP 12644]
[New LWP 12645]
[New LWP 12648]
[New LWP 12636]
[New LWP 12633]
[New LWP 12658]
[New LWP 12656]
[New LWP 12655]
[New LWP 12649]
[New LWP 12659]
[New LWP 12657]
[New LWP 12651]
[New LWP 12660]
[New LWP 12637]
[New LWP 12661]
Core was generated by `./srcds_linux -game csgo -console -debug -usercon -secure -autoupdate -steam_di'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0xf7d49a0f in ?? ()
[Current thread is 1 (LWP 12628)]
#0 0xf7d49a0f in ?? ()
Backtrace stopped: Cannot access memory at address 0xfff312dc
No symbol table info available.
eax 0x1 1
ecx 0x70616577 1885431159
edx 0xbe9f9c8 199883208
ebx 0xec1dcff4 -333590540
esp 0xfff312dc 0xfff312dc
ebp 0x4 0x4
esi 0x0 0
edi 0x9a4e100 161800448
eip 0xf7d49a0f 0xf7d49a0f
eflags 0x210287 [ CF PF SF IF RF ID ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x63 99
No shared libraries loaded at this time.
End of Source crash report
----------------------------------------------
----------------------------------------------
CRASH: Пт фев 26 12:28:28 MSK 2021
Start Line: ./srcds_linux -game csgo -console -debug -usercon -secure -autoupdate -steam_dir /home/server2000/steamcmd -steamcmd_script /home/server2000/steamcmd/runscript_server2000 -maxplayers_override 25 -tickrate 128 +ip 192.168.1.136 +net_public_adr 212.12.15.54 -port 27015 +tv_port 37015 +sv_pure 0 +game_type 0 +game_mode 0 +map 000
[New LWP 13151]
[New LWP 13165]
[New LWP 13161]
[New LWP 13172]
[New LWP 13166]
[New LWP 13168]
[New LWP 13176]
[New LWP 13173]
[New LWP 13177]
[New LWP 13178]
[New LWP 13162]
[New LWP 13155]
[New LWP 13157]
[New LWP 13154]
[New LWP 13152]
[New LWP 13174]
[New LWP 13175]
Core was generated by `./srcds_linux -game csgo -console -debug -usercon -secure -autoupdate -steam_di'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0xf7d7da0f in ?? ()
[Current thread is 1 (LWP 13151)]
#0 0xf7d7da0f in ?? ()
Backtrace stopped: Cannot access memory at address 0xffd093ac
No symbol table info available.
eax 0x1 1
ecx 0x70616577 1885431159
edx 0xbd3a7c8 198420424
ebx 0xec1dcff4 -333590540
esp 0xffd093ac 0xffd093ac
ebp 0x4 0x4
esi 0x0 0
edi 0x98e0100 160301312
eip 0xf7d7da0f 0xf7d7da0f
eflags 0x210287 [ CF PF SF IF RF ID ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x63 99
No shared libraries loaded at this time.
End of Source crash report
----------------------------------------------
Очень схожи: (первые 3 строки)SourceMod Version: 1.10.0.6502
Metamod:Source version 1.11.0-dev+1144
падает на MIRAGE тольки когда +10 игроков, пару раз в день
Найдутся добрые люди, кто подскажет в чем прикол? Первый раз с accelator вообще работаю - Throttle
Кто работает с CSGO и видит краши в server.so и engine.so
Надо выкачать IDA 7+ и утекшие исходники ксго 17-ого года.
Далее:
1) загрузить сошку в IDA (займет минут 5)
2) После загрузки переключить в text view (правой кнопкой по дереву -> text view)
3) Выполнить Jump -> Jump to address и указать адрес из крашстека (к примеру такой 0x68ffbf)
4) Окно переместится в subroutine (функцию) где случился краш
5) Дальнейшая задача сводится к определению названия этой функции
для этого надо найти уникальный идентификатор, по которому можно найти эту функцию в исходниках.
Обычно, такой идентификатор - текстовая строка (к примеру "target") или какая-то уникальная константа.
Если в самой функции ничего такого нет, можно:
- посмотреть такие идентификаторы в функциях, которые ссылаются на эту функцию. Они перечислены в "CODE XREF" под заголовком "S U B R O U T I N E".
- посмотреть такие идентификаторы в функциях, которые вызываются из нашей функции.
Так-же в поиске может помочь псевдокод. его можно включить нажатием F5 (работает только в IDA 32bit)
6) Как только найдена уникальная текстовая строка или константа - надо ее найти в исходниках, это можно сделать через Total Commander или WordPad.
К примеру, из стека выше - есть функция server.so + 0x736e53 В ней есть строка "%s(%s) thinking for %.02f ms!!!\n", которая через исходники выводит на функцию CBaseEntity::PhysicsDispatchThink. Через сравнение исходного кода и псевдокода каждой из оставшихся функций в стеке можно добраться до функции где случился краш и выяснить что могло пойти не так.
Примечание: по умолчанию IDA выводит только 2 xrefs, лучше это число поменять на 50 в Options->General->Cross-references
Если краш случился в коде, который был добавлен после 17-ого кода, то этот способ не будет работать (разве что получится разобрать псевдокод, ну или можно сдетоурить функцию, об этом ниже).
Если в стеке функция без уникальных идентификаторов и идентификаторов нет в зависимых функциях, то можно попробовать найти их в функциях ниже и выше, часто компилятор добавляет сабрутины в порядке в каком они идут в исходниках.
От себя советую использовать версию акселератора без привязки к Throttle (была выложена в этой теме чуть раньше), она отображает не только стек функций но и тип краша, содержимое памяти, регистров. Там можно увидеть делати краша, название плагина, который работал в момент краша, ассерт сообщения и т.д.
К примеру, для стека #54 мы бы с большой вероятностью увидели работу вочдога, но throttle не показывает что стало причиной завершение процесса. Я бы посоветовал автору проверить все плагины на наличие синхронных SQL запросов.
Что делать если нашли функцию, в которой часто происходит краш, но не понятно что в ней не так:
Адрес краша указывает на место краша и при переходе в псевдокод IDA показывает место краша (иногда ошибается на 1-2 строчки).
Если это не помогает, можно сдетоурить функцию и посмотреть содержимое аргументов функции.
За основу можно взять этот экстеншин: [CS:S] Flashbang Tools - AlliedModders
В экстеншине есть несколько примеров детоуринга фнкций по сигнатурам.
Для детоуринга функции нужно знать ее описание (возвращаемый тип, количество и типы аргументов) и сигнатуру.
Описание функции можно подсмотреть в псевдокоде (F5).
Для получения сигнатуры функции:
1) проматываем функцию в IDA вверх к надписи = S U B R O U T I N E ==
2) Options -> Disasembly -> Number of opcode bytes -> 12
->Видим байты сигнатуры (пример в красной рамке на скриншоте).
3) Если просто скопировать байты, сигнатура с большой вероятностью не заработает. Всё из-за wild-cards - байтов, которые в рантайме меняются.
Такие байты в сигнатуре надо заменить на 2A. Есть несколько способов получения рабочей сигнатуры:
- Изучить каждую инструкцию и заменить все wild-card байты на 2A.
- Взять предыдущую версию сошки, найти в ней эту функцию и все байты, который отличаются, заменить на 2A.
- Заменить все кроме первых байтов в строке на 2A. Не самый красивый способ т.к. получается большая и менее надёжная сигнатура, но способ рабочий. Для примера из скриншота получается: \x6A\x2A\x68\x2A\x2A\x2A\x2A\x64\x2A\x2A\x2A\x2A\x2A\x50\x83\x2A\x2A....
Длину сигнатуры следует уменьшать до момента, когда в ALT+B по сигнатуре начнут находиться другие функции.
В поиске нужно вписывать так: 6A ? 68 ? ? ? ? 64
Небольша поправка, если необходимо сделать Detour функции то необходимо определить ей так называемое "соглашение функции" (cdecl, thiscall, fastcall и другие), бывает так, что IDA не всегда правильно генерирует соглашение через псевдо-код, поэтому придётся подставлять разные варианты, также, если же в краш логе явно видно, что происходит null point dereference (самая частая ошибка, ввиду невнимательности программиста, который писал код), то исправить это можно добавив патч-код на ассемблере, предварительно выделив память под написание ассемблерныне инструкций, чтобы исключить нулевой указатель и сделать выход из функции. Пример, где с помощью ассемблера исправляли null point dereferenceКто работает с CSGO и видит краши в server.so и engine.so
Надо выкачать IDA 7+ и утекшие исходники ксго 17-ого года.
Далее:
1) загрузить сошку в IDA (займет минут 5)
2) После загрузки переключить в text view (правой кнопкой по дереву -> text view)
3) Выполнить Jump -> Jump to address и указать адрес из крашстека (к примеру такой 0x68ffbf)
4) Окно переместится в subroutine (функцию) где случился краш
5) Дальнейшая задача сводится к определению названия этой функции
для этого надо найти уникальный идентификатор, по которому можно найти эту функцию в исходниках.
Обычно, такой идентификатор - текстовая строка (к примеру "target") или какая-то уникальная константа.
Если в самой функции ничего такого нет, можно:
- посмотреть такие идентификаторы в функциях, которые ссылаются на эту функцию. Они перечислены в "CODE XREF" под заголовком "S U B R O U T I N E".
- посмотреть такие идентификаторы в функциях, которые вызываются из нашей функции.
Так-же в поиске может помочь псевдокод. его можно включить нажатием F5 (работает только в IDA 32bit)
6) Как только найдена уникальная текстовая строка или константа - надо ее найти в исходниках, это можно сделать через Total Commander или WordPad.
К примеру, из стека выше - есть функция server.so + 0x736e53 В ней есть строка "%s(%s) thinking for %.02f ms!!!\n", которая через исходники выводит на функцию CBaseEntity::PhysicsDispatchThink. Через сравнение исходного кода и псевдокода каждой из оставшихся функций в стеке можно добраться до функции где случился краш и выяснить что могло пойти не так.
Примечание: по умолчанию IDA выводит только 2 xrefs, лучше это число поменять на 50 в Options->General->Cross-references
Если краш случился в коде, который был добавлен после 17-ого кода, то этот способ не будет работать (разве что получится разобрать псевдокод, ну или можно сдетоурить функцию, об этом ниже).
Если в стеке функция без уникальных идентификаторов и идентификаторов нет в зависимых функциях, то можно попробовать найти их в функциях ниже и выше, часто компилятор добавляет сабрутины в порядке в каком они идут в исходниках.
От себя советую использовать версию акселератора без привязки к Throttle (была выложена в этой теме чуть раньше), она отображает не только стек функций но и тип краша, содержимое памяти, регистров. Там можно увидеть делати краша, название плагина, который работал в момент краша, ассерт сообщения и т.д.
К примеру, для стека #54 мы бы с большой вероятностью увидели работу вочдога, но throttle не показывает что стало причиной завершение процесса. Я бы посоветовал автору проверить все плагины на наличие синхронных SQL запросов.
Что делать если нашли функцию, в которой часто происходит краш, но не понятно что в ней не так:
Адрес краша указывает на место краша и при переходе в псевдокод IDA показывает место краша (иногда ошибается на 1-2 строчки).
Если это не помогает, можно сдетоурить функцию и посмотреть содержимое аргументов функции.
За основу можно взять этот экстеншин: [CS:S] Flashbang Tools - AlliedModders
В экстеншине есть несколько примеров детоуринга фнкций по сигнатурам.
Для детоуринга функции нужно знать ее описание (возвращаемый тип, количество и типы аргументов) и сигнатуру.
Описание функции можно подсмотреть в псевдокоде (F5).
Для получения сигнатуры функции:
1) проматываем функцию в IDA вверх к надписи = S U B R O U T I N E ==
2) Options -> Disasembly -> Number of opcode bytes -> 12
->Видим байты сигнатуры (пример в красной рамке на скриншоте).
3) Если просто скопировать байты, сигнатура с большой вероятностью не заработает. Всё из-за wild-cards - байтов, которые в рантайме меняются.
Такие байты в сигнатуре надо заменить на 2A. Есть несколько способов получения рабочей сигнатуры:
- Изучить каждую инструкцию и заменить все wild-card байты на 2A.
- Взять предыдущую версию сошки, найти в ней эту функцию и все байты, который отличаются, заменить на 2A.
- Заменить все кроме первых байтов в строке на 2A. Не самый красивый способ т.к. получается большая и менее надёжная сигнатура, но способ рабочий. Для примера из скриншота получается: \x6A\x2A\x68\x2A\x2A\x2A\x2A\x64\x2A\x2A\x2A\x2A\x2A\x50\x83\x2A\x2A....
Длину сигнатуры следует уменьшать до момента, когда в ALT+B по сигнатуре начнут находиться другие функции.
В поиске нужно вписывать так: 6A ? 68 ? ? ? ? 64