Как получить Dump падения HLDS | Dev-CS.ru
> > > >

Как получить Dump падения HLDS

Сообщения
108
GitHub
Adidasman1
Рейтинг
217
#1
Не стоит просто так выкладывать дампы в интернете, так как зачастую в них содержится полная информация о сервере, включая rcon и прочее.
Для передачи можно архивировать их с паролем, что полезно ещё тем, что жмутся они весьма хорошо.


Windows:
  • С использованием WER (Windows Error Reporting):
Разрешить WER (отчеты об ошибках):​
До Vista:​
Запустить drwtsn32.exe и выбрать "Full" напротив Crash Dump File. Тут же можно увидеть (или настроить) куда будут складываться дампы.​
На Vista и выше:​
Редактирование реестра, удобный способ от:​
Настройки:

NAME_APP - hlds.exe​
имя приложения, которому нужно будет создавать дампы в случае аварийного завершения.
REG_LINK - HKLM\Software\Microsoft\Windows\Windows Error Reporting​
путь до раздела Windows Error Reporting (Эту настройку скорее всего менять не нужно, думаю во всех Windows пути одинаковые)
DumpType - 2​
0 - Обычный дамп
1 - Минимальный дамп
2 - Полный дамп
DumpCount - 15​
количество создаваемых дампов, если в папке количество дампов будет больше указанного значения, то будет удаляться старый дамп для создания нового дампа.
DumpFolder - C:\CrashDumps​
путь до папки, куда будут складываться дампы.
(во избежании всяких проблем не используйте пробелы или кириллицу в путях)

Установка:
Скачать архив add_RegistryDumps.zip и разархивировать.​
Запустить add_RegistryDumps.bat

После записи в реестр вы должны убедиться что у вас включена служба Отчеты об ошибках Windows.​
Дальше нажать горячую клавишу Windows + R (Windows кнопка находится между ctrl и alt) или можно вызвать cmd.exe или Пуск -> Выполнить, сразу после этого нужно ввести gpedit.msc, далее см скриншот.​
gpedit.jpg
Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Отчеты об ошибок Windows
Для удаления настроек в реестре используйте: remove_RegistryDumps.zip
  • С использованием утилиты userdumps, инструкция от:
Установка:
Скачать архив UserModeProcessDumper8_1_2929_5.zip и разархивировать (по умолчанию C:\kktools\userdump8.1).​
Запустите файл setup.exe из каталога:​
Если вы используете 32-битную ОС Windows XP/2003, то C:\kktools\userdump8.1\x86.​
Если вы используете 64-битную ОС Windows XP/2003, то C:\kktools\userdump8.1\x64.​
В окне Мастера установки нажмите на кнопку Далее.​
(Только для 32-битных ОС) В окне Terminate Mode выберите Disable "Dump on Process Termination" feature и нажмите на кнопку Далее.​
1595-1-ru14-107345.png
Нажмите на кнопку Готово и дождитесь завершения установки.​
В окне User Mode Process Dump Setup нажмите на кнопку ДА (Если вы не знаете как зайти в меню с настройками userdump то их можно найти в Панель управления - Process Dumper).​

2. Добавление приложения:
В открывшемся окне Свойства: User Mode Process Dumper Setup жмём New и добавляем имя нужной нам программы на пример: hlds.exe (расширение обязательно!) и жмём ОК.​
Свойства_User_Mode_Process_Dumper.jpg

3. Настройки:
В окне Свойства: User Mode Process Dumper Setup находим созданное только-что правило приложения, выделяем его и жмём кнопку Rules
В открывшемся окне Process Monitoring Ruless for hlds.exe​
1. Выберем Use custom rules.​
2. Если требуется меняем папку для хранения созданных дампов.​
3. В Exeption Codes выделяем (нажатием ЛКМ) следующие коды: "Access Violation, Overflow, Illegal Instruction, Stack oveflow."​
4. Выставляем параметр Save Mode в режим Cyclic saving (5 times).​
Должно получится примерно так:​
Process_Monitoring_rules_for_hlds.exe.jpg

Ps: Рекомендую использовать совместно с Dr Watson с типом дампов "Краткий", т.к. доктор умеет вести логи в текстовом формате, которые дадут возможность отбирать нужные дампы, а userdump будет делать полные дампы.

Linux:
Сервер надо запускать с ключем -debug.
Если в системе установлен gdb, то автоматически в файле debug.log будет записываться внятная информация об ошибке. Так что рекомендуется его поставить (команда зависит от используемой системы, на дебиане это apt install gdb). Хотя для создания дампов это не требуется, это фактически обязательно надо сделать при наличии возможности, так как в debug.log при этом будет записано место падения, что позволит сразу что-то сказать об ошибке. Получение этой же информации на другой системе из дамп-файла потребует наличия всех бинарников от сервера.

По умолчанию дамп-файл называется core, записывается в рабочей папке, и, соответственно, будет перезаписываться. Во избежание, можно добавлять к имени идентификатор процесса:
echo 1 > /proc/sys/kernel/core_uses_pid
или складывать дампы в /tmp:
echo /tmp/%e-%t-%p-%c.dmp > /proc/sys/kernel/core_pattern
Больше информации тут: http://man7.org/linux/man-pages/man5/core.5.html

Запуск без sudo (под root, иначе общие настройки системы должны быть выставлены на unlimited):
ulimit -c unlimited && ./hlds_run -debug ...
Запуск с sudo (под пользователем hlds):
ulimit -Hc unlimited && sudo -u hlds sh -c "ulimit -Sc unlimited && ./hlds_run -debug ..."
Проверка запуска из под sudo:
ulimit -Hc unlimited && sudo -u hlds sh -c "ulimit -Sc unlimited && whoami && ulimit -Sc && ./hlds_run -debug ..."
выводит имя пользователя под которым произойдет запуск и лимит на создание дампов, после чего запускает сервер.

Для тестирования настроек создания дампов можете использовать специальный плагин, который вызовет ошибку сегментации, после чего у вас должен появиться debug.log в корне сервера:
C++:
#include <amxmodx>
#include <fakemeta>

public plugin_init()
{
    register_plugin("Crash", "1.0", "Dev-CS Team");

    // Generate exception code 0xC0000005
    set_task(1.0, "GenerateExceptionCode");
}

public GenerateExceptionCode()
{
    server_print("[Crash]: I call segmentation fault! Exception code: 0xC0000005");

    // Put invalid pointer that will be generate access violation exception
    set_tr2(0xDEADBEEF, TR_InWater, true);
}

Источник: aghl.ru
 

Вложения

Последнее редактирование модератором:
Сообщения
21
Рейтинг
2
#2
Скажите в 10 винде по умолчанию дампы вообще не пишуться, или место изменено? Раньше стояла 7 и после краша любого приложения( например, эксплорер, стим, кс) писался дамп в user/appdata/locall/crashdump
 
 
Сообщения
828
Рейтинг
979
#3
eduardglotov, Заходим в Панель управления-Все элементы панели управления-Система-Дополнительные параметры системы, выбираем Параметры загрузки и восстановления системы
2017-12-26_21-21-32.jpg
Проверяем, что создание дампов включено
1514312584693.png
И после краша ищем MEMORY.DMP в папке Windows (Могут еще создаватсья минидампы, которые пишутся в C:\Windows\Minidump)
 
  1
Сообщения
33
Рейтинг
1
#4
Adidasman, а что делать если РеХлдс и нет возможность добавить что либо в строку ? как получить debug.log ?
 
 
Сообщения
157
Рейтинг
168
#5
ALT, спросить у ТП хостинга. Они в итоге дадут, иногда после ругани.
 
 
Сообщения
532
Рейтинг
432
#6
 

wopox1337

Рационалист
Сообщения
991
GitHub
wopox1337
Рейтинг
675
#7
А так же не забываем ещё один способ включения unlimited для создания не усечённого дампа.
в файле hlds_run- заменить 126 строку:
Код:
-    ulimit -c 2000
+    ulimit -c unlimited
Код:
#!/bin/sh
#
#       Copyright (c) 2002, Valve LLC. All rights reserved.
#
#    a wrapper script for the main hl dedicated server binary.
#    Performs auto-restarting of the server on crash. You can
#    extend this to log crashes and more.
#

# setup the libraries, local dir first!
export LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH"

init() {
    # Initialises the various variables
    # Set up the defaults
    GAME="valve"
    DEBUG=0
    RESTART="yes"
    HL=./hlds_linux
    HL_DETECT=1
    TIMEOUT=10 # time to wait after a crash (in seconds)
    CRASH_DEBUG_MSG="email debug.log to [email protected]"
    GDB="gdb" # the gdb binary to run
    DEBUG_LOG="debug.log"
    PID_FILE=""
    STEAM=""
    STEAMERR=""
    SIGINT_ACTION="quit 0" # exit normally on sig int
    NO_TRAP=0
    AUTO_UPDATE=""
    BETA_VERSION=""
    PARAMS=$*

    # Remove any old default pid files
    # Cant do this as they may be still running
    #rm -f hlds.*.pid

    # use the $FORCE environment variable if its set
    if test -n "$FORCE" ; then
        # Note: command line -binary will override this
        HL=$FORCE
        HL_DETECT=0
    fi

    while test $# -gt 0; do
        case "$1" in
        "-game")
            GAME="$2"
            shift ;;
        "-debug")
            DEBUG=1
            # Ensure that PID_FILE is set
            if test -z "$PID_FILE"; then
                PID_FILE="hlds.$$.pid"
            fi ;;
        "-norestart")
            RESTART="" ;;
        "-pidfile")
            PID_FILE="$2"
            shift ;;
        "-binary")
            HL="$2"
            HL_DETECT=0
            shift ;;
        "-timeout")
            TIMEOUT="$2"
            shift ;;
        "-gdb")
            GDB="$2"
            shift ;;
        "-debuglog")
            DEBUG_LOG="$2"
            shift ;;
        "-autoupdate")
            AUTO_UPDATE="yes"
            STEAM="steamcmd/steamcmd.sh"
            RESTART="yes" ;;
        "-steamerr")
            STEAMERR=1 ;;
        "-ignoresigint")
            SIGINT_ACTION="" ;;
        "-notrap")
            NO_TRAP=1 ;;
        "-beta")
            BETA_VERSION="$2"
            shift ;;
        "-help")
            # quit with syntax
            quit 2
            ;;
        esac
        shift
    done

    # Ensure we have a game specified
    if test -z "$GAME"; then
        echo "Unable to determine game type from command line."
        quit 1
    elif test ! -d "$GAME"; then
        echo "Invalid game type '$GAME' sepecified."
        quit 1
    fi

    #if test 0 -eq "$NO_TRAP"; then
        # Set up the int handler
        # N.B. Dont use SIGINT symbolic value
        #  as its just INT under ksh
        #trap "$SIGINT_ACTION" 2
    #fi

    if test ! -f "$HL"; then
        echo "Half-life binary '$HL' not found, exiting"
        quit 1
    elif test ! -x "$HL"; then
        # Could try chmod but dont know what we will be
        # chmoding so just fail.
        echo "Half-life binary '$HL' not executable, exiting"
        quit 1
    fi

    # Setup debugging
    if test "$DEBUG" -eq 1; then
        #turn on core dumps :) (if possible)
        echo "Enabling debug mode"
        if test "`ulimit -c`" -eq 0 ; then
-            ulimit -c 2000
+            ulimit -c unlimited
        fi
        GDB_TEST=`$GDB -v`
        if test -z "$GDB_TEST"; then
            echo "Please install gdb first."
            echo "goto http://www.gnu.org/software/gdb/ "
            DEBUG=0 # turn off debugging cause gdb isn't installed
        fi
    fi

    PID_IN_PARAMS="`echo $PARAMS | grep -e -pidfile`"

    if test -z "$PID_IN_PARAMS" && test -n "$PID_FILE"; then
        HL_CMD="$HL $PARAMS -pidfile $PID_FILE"
    else
        HL_CMD="$HL $PARAMS"
    fi
}

syntax () {
    # Prints script syntax

    echo "Syntax:"
    echo "$0 [-game <game>] [-debug] [-norestart] [-pidfile]"
    echo "    [-binary [hlds_linux]"
    echo "    [-timeout <number>] [-gdb <gdb>] [-autoupdate]"
    echo "    [-steamerr] [-ignoresigint] [-beta <version>]"
    echo "  [-debuglog <logname>]"
    echo "Params:"
    echo "-game <game>            Specifies the <game> to run."
    echo "-debug                  Run debugging on failed servers if possible."
    echo "-debuglog <logname>    Log debug output to this file."
    echo "-norestart              Don't attempt to restart failed servers."
    echo "-pidfile <pidfile>      Use the specified <pidfile> to store the server pid."
    echo "-binary <binary>        Use the specified binary ( no auto detection )."
    echo "-timeout <number>       Sleep for <number> seconds before restarting"
    echo "            a failed server."
    echo "-gdb <gdb>              Use <dbg> as the debugger of failed servers."
    echo "-steamerr               Quit on steam update failure."
    echo "-beta <version>        Make use of a beta version of this server from Steam"
    echo "-ignoresigint           Ignore signal INT ( prevents CTRL+C quitting"
    echo "            the script )."
    echo "-notrap                 Don't use trap. This prevents automatic"
    echo "            removal of old lock files."
    echo ""
    echo "Note: All parameters specified as passed through to the server"
    echo "including any not listed."
}

debugcore () {
    # Debugs any core file if DEBUG is set and
    # the exitcode is none 0

    exitcode=$1

    if test $exitcode -ne 0; then
        if test -n "$DEBUG" ; then
            echo "bt" > debug.cmds;
            echo "info locals" >> debug.cmds;
            echo "info sharedlibrary" >> debug.cmds
            echo "info frame" >> debug.cmds;  # works, but gives an error... must be last
            echo "----------------------------------------------" >> $DEBUG_LOG
            echo "CRASH: `date`" >> $DEBUG_LOG
            echo "Start Line: $HL_CMD" >> $DEBUG_LOG

            # check to see if a core was dumped
            if test -f core ; then
                CORE="core"
            elif test -f core.`cat $PID_FILE`; then
                CORE=core.`cat $PID_FILE`
            elif test -f "$HL.core" ; then
                CORE="$HL.core"
            fi
           
            if test -n "$CORE"; then
                $GDB $HL $CORE -x debug.cmds -batch >> $DEBUG_LOG
            fi
       
            echo "End of crash report" >> $DEBUG_LOG
            echo "----------------------------------------------" >> $DEBUG_LOG
            echo $CRASH_DEBUG_MSG
            rm debug.cmds
        else
            echo "Add \"-debug\" to the $0 command line to generate a debug.log to help with solving this problem"
        fi
    fi
}


update() {
    updatesingle
}

updatesingle() {
    # Run the steam update
    # exits on failure if STEAMERR is set

    if test -n "$AUTO_UPDATE"; then
        if test -f "$STEAM"; then
            echo "Updating server using Steam."
            CMD="$STEAM +logon anonymous +force_install_dir .. +app_update 90 +quit";
            if  test -n "$BETA_VERSION"; then
              CMD="$CMD -beta $BETA_VERSION";
            fi
           
            STEAMEXE=steamcmd $CMD
            if test $? -ne 0; then
                if test -n "$STEAMERR"; then
                    echo "`date`: Steam Update failed, exiting."
                    quit 1
                else
                    echo "`date`: Steam Update failed, ignoring."
                    return 0
                fi
            fi
        else
            if test -n "$STEAMERR"; then
                echo "Could not locate steam binary:$STEAM, exiting.";
                quit 1
            else
                echo "Could not locate steam binary:$STEAM, ignoring.";
                return 0
            fi
        fi
    fi

    return 1
}
   
run() {
    # Runs the steam update and server
    # Loops if RESTART is set
    # Debugs if server failure is detected
    # Note: if RESTART is not set then
    # 1. DEBUG is set then the server is NOT exec'd
    # 2. DEBUG is not set the the server is exec'd

    if test -n "$RESTART" ; then
        echo "Auto-restarting the server on crash"

        #loop forever
        while true
        do
            # Update if needed
            update

            # Run the server
            $HL_CMD
            retval=$?
            if test $retval -eq 0 && test -z "$RESTART" ; then
                break; # if 0 is returned then just quit
            fi

            debugcore $retval

            echo "`date`: Server restart in $TIMEOUT seconds"

            # don't thrash the hard disk if the server dies, wait a little
            sleep $TIMEOUT
        done # while true
    else
        # Update if needed
        update

        # Run the server
        if test "$DEBUG" -eq 0; then
            # debug not requested we can exec
            exec $HL_CMD
        else
            # debug requested we can't exec
            $HL_CMD
            debugcore $?
        fi
    fi
}

quit() {
    # Exits with the give error code, 1
    # if none specified.
    # exit code 2 also prints syntax
    exitcode="$1"

    # default to failure
    if test -z "$exitcode"; then
        exitcode=1
    fi

    case "$exitcode" in
    0)
        echo "`date`: Server Quit" ;;
    2)
        syntax ;;
    *)
        echo "`date`: Server Failed" ;;
    esac

    # Remove pid file
    if test -n "$PID_FILE" && test -f "$PID_FILE" ; then
        # The specified pid file
        rm -f $PID_FILE
    fi

    # reset SIGINT and then kill ourselves properly
    trap - 2
    kill -2 $$
}

# Initialise
init $*

# Run
run

# Quit normally
quit 0
 
  3
Сообщения
33
Рейтинг
1
#8
fantom, ответ ТП хостинга
Добрый день

debug.log не создался
-debug в параметрах есть

./hlds_linux -game cstrike +ip 46.174.48.22 +port 27322 +map $2000$ +maxplayers 24 -pidfile cstrike.pid -condebug +sys_ticrate 10000 -noipx -debug
 
 
> > > >