Сталкер зов припяти stack trace

Материал из S.T.A.L.K.E.R. Ins >

Привет всем! Игра S.T.A.L.K.E.R., а конкретно сам движок X-Ray довольно капризный, и зачастую как в процессе модификации, так и во время игры игра «вылетает». Чтобы мы знали причину вылета, движок нам оставляет лог вылета. Лог вылета можно посмотреть несколькими способами:

  • В текстовом редакторе нажать Ctrl+V (Вставить)
  • Посмотреть лог игры включая лог вылета в файле xray_имя_пользователя.log в папке C:Documents and SettingsAll UsersДокументыSTALKER-***logs
  • Посмотреть непосредственно в окне багтрекера (только в ЧН и ЗП).

Ну приступим. Начнём с простых:

Здесь игра не может открыть звуковой OGG-файл под названием sound в папке d:stalkergamedatasoundsmusic

Не может найти текстуру act_corp_monolit из папки texturesact

Не найдена трёхмерная OGF-модель mesh.ogf из папки meshesphysics.

Не найдена система частиц (партикл) hit_water_00 в директории hit_fx файла particles.xr (подробно опишу позже).

Не установлен интервал (время) проигрывания группы/эффекта партиклов. В Particle Group -> End Time(s) укажите время, через которое частицы должны исчезнуть. Заодно проверьте particle effect -> Kill Old -> Age limit.

Не найден шейдер modelsantigas_glass в библиотеке шейдеров.

Тут проблема вся в том, что неправильно закомпилился шейдер, при компиляции уровня на качестве, более высоком чем Draft. Нужно скачивать исправление шейдеров от товарища Haron. Для ЗП (ЧН) это может ещё быть из-за отсутствия thm-ок для текстур террейна уровня!

Нехватка оперативной памяти.

Неправильно настроены шейдеры. В настройках шейдера, во вкладке R2-A поставьте текстуру, которая вдальнейшем будет накладываться на террейн.

Не найдена переменная ammo_mag_size в секции [wpn_addon_grenade_launcher].

Переполнение стека. Смотрим внимательно: lua_error. Ошибка, возможно, в скриптах.

Какая то вершина (вейпоинт) пути sniper_3_walk стоит в неположенном месте (например не на аи-сетке). Объект stalker_0002 (в данном случае сталкер) который якобы двигался по пути sniper_3_walk попал на эту точку, а заодно ушёл за аи-сетку. Этого движок не терпит.

То же самое произойдет если координаты(вейпоинт) пути sniper_3_walk совпадет с координатами места, где НПС запрещено находиться, будь то рестриктор или аномалия в схеме обхода аномалий. Также этот вылет наблюдается при попытке отправить НПС за пределы места работ параметр out_rest = "имя_рестриктора" в файле загрузки работ гулага. Попробуйте любого сталкера из лагеря новичков отправить, допустим, к остановке — получите этот самый вылет.

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

Ошибка распространённая. На первый взгляд кажется, что ошибка как раз в скриптах, но всё может быть иначе. В одной из пиратских версий игры этот вылет наблюдается особенно часто из-за криво модифицированного файла "XR_3DA.exe". Если же вы уверены, что у вас лицензионная версия игры, можно попробовать сделать так: открываем файл _g.script блокнотом, закомменчиваем 20 строку (ставим перед строкой —) и идём к тому месту где поймали вылет. Так мы получим более развёрнутый ответ.

Участник: Призрак: Автор прав в том что вылет очень распространен, но так его исправлять нельзя, так как nil передается в эту функцию только при каком-то форс-мажоре. Поэтому необходимо перейти в _g.script в функцию printf и перед log1(string.format(fmr. )) дописать: get_console():execute("load "..fmt). После этого запустить еще раз игру и посмотреть при передачи какой строки игра вылетает. Потом найти эту строку в скриптах игры и прикинуть почему аргумент (у нас это аргумент №2 (bad argument #2)) равен nil. Возможность такового вылета из — за слишком быстрой скорости актера, слишком высокому прыжку. (Редактировать: config/creatures/actor.ltx)

Читайте также:  Scangear mf невозможно установить связь со сканером

Проблема возникает при убийстве НПСмутанта. Типичный вылет по нехватке ресурсов. Встречается в основном на больших локациях. Но не на всех. На болотах из ЧН такой вылет встречается, а вот с локации aver от Кости V такого вылета нет. Однако для данного вылета есть таблетка, в виде правленого экзешника. Искать на АМК-форуме.

Неправильный визуал (модель) НПС.

В диалоге esc_dialog нет доступной для отображения фразы (скажем, все заткнуты инфопоршенами).

Игра не нашла в модели трёхмерную анимацию с именем death_init.

Причина вылета в том что игра не понимает значения 0 в danger_ignore.Проще говоря в логике какого то персонажа параметр danger_ignore = 0 либо в минусовом значении. Либо его вообще нету

P.S. Также может быть причина в том, что в логике у какого-то АИ что-то неправильно указано. Для исправления рекомендую вставить строчку перед 116: get_console():execute(self.object:name()). То имя в логе, которое будет последним после вылета, указывает на персонажа с кривой логикой.

Не найден класс персонажа. Возможно, НПС не прописан под своим классом в gamedata
pc_profile.xml, либо в creaturesspawn_section.ltx, либо в gameplaycharacter_desc.xml

Игра не может найти секцию. Это может быть предмет, НПС и многое другое. Возможно, вы написали название с ошибками. Либо когда добавляли его в: продажу, скрипт, НПС , выпадение из НПС, а в редких случаях это может быть иммунитет чего либо(определить потом трудно). Часто такое бывает связано с названием секции.

Не найдена переменная remove_time в секции [vehicle_btr]. А в данном случае ошибка в том что если вы делали предмет как физическую модель(то бишь, которую нельзя использовать, говорить и вообще он похож на декорации типа деревьев, столов и прочего хлама) то необходимо указывать remove_time в его секции.

Метод обращения в игре не предусмотрен. Возможно, стоит пересмотреть подход к тому или иному скрипту.

На мультиплеерной карте не найдены точки респавна игроков. В SDK должен быть красный пацанчик. Настроить Team = 0

Такое иногда бывает, когда ты (ГГ) или НПС заряжает дробовик или другое оружие со значением tri_state_reload = true. Это глюк. в игре что-то сбивается, и когда у дробовика максимальное количество заряженных патронов скажем 6, он заряжается за 6 и дальше.. дальше.. дальше.. и так пока не произойдёт вылет с вышеуказанным логом. вылет не значительный и редкий, но если он случается слишком часто, можно в конфигах всех дробовиков и ружей поменять значение tri_state_reload = true на tri_state_reload = false.

Такой лог бывает когда подключаешь локацию из ТЧ в ЗП. Причина проста — в ЗП уровнях файл строчка bound_rect пишется в файле gamedatalevelsимя_уровняlevel.ltx, а в ТЧ строка bound_rect для каждого уровня непосредственно в файле gamedataconfiggame_maps_single.ltx .
Исправить просто, нужно изменить файл gamedatalevelsимя_уровняlevel.ltx в подключенной локации, просто перенести строку bound_rect из game_maps_single.ltx в level.ltx перед строчкой texture.

Читайте также:  Прошивка для телефона lg h422

Случается когда одна из dll некорректна. Например такой вылет бывает если подсунуть в ТЧ 1.0004 xrGame от 6 патча.

Вылет встречается только на 6 патче при попытке хаванья из трупа. Ищите, исправленную Kolmogor’om, xrGame.dll в Интернете

Данный вылет бывает когда у какого либо из объектов установлено некорректное значение (читал, сам не получал его) Или же если данный вылет происходит при вызове класса, то проблема в том что в методе __init() класса прописано super()

Вылет происходит в двух случаях — когда скрипт пытается вызвать функцию из несуществующего файла или когда в файле допущена синтаксическая ошибка.

Происходит при попытке вызвать класс, которого не существует

Небольшой пример из практики по определению ошибки в особых случаях(для начинающих): Игра зависла, картинка на экране не меняется, на Ctrl + Alt+ Delete не реагирует. Только "Холодная перезагрузка" reset. Но при этом обычно в логе нет записи и обычным Ctrl + V ошибку не увидеть. Я пользуюсь программой Punto Switcher. Есть в ней опция "дневник", она ведёт запись всех нажатий клавиш и по нажатию сочетаний клавиш содержимое памяти может записывать в дневник. теперь когда игра зависла и картинка на экране не меняется, нажимаете Ctrl + Alt+ Delete. Внешне ничего не изменится, но ОС будет реагировать на клавиши, нажимаете сочетание клавиш "записать в дневник". Делаете перезагрузку, открываете дневник — Ваша ошибка записана. "дядя Саша"

Возникает при создании или добавлении чужих артефактов. В artefacts.ltx, в секции af_base есть параметр particles_bone=link. Это имя косточки, которая принимается за центр при проигрывании партикла. Если кость в артефакте называется по иному, например joint2, и это не указанно в секции нового арта, которая наследуется от базовой и подразумевает естественно наличие link, получаем вылет. Решается конвертированием модели арта в .object, просмотром в sdk и выяснением имени косточки с занесением в конфиг.

Вылет заканчивающийся строкой, то что выше не указываю роли не играет, здесь роль играет только "bad argument #3". Если это появилось значит у Вас ошибка в файле с расширением .ltx (обращаю внимание, не путать с файлами .script), которая находится между [. ] квадратными скобками в файле. Это может быть секция предмета, секция логики, секция пути файла way_, т.е. там где присутствуют квадратные скобки.

Скорее всего, отсутствует файл level.ai. Возможно после правки уровня в SDK и компиляции AI, вы забыли его скопировать в папку уровня. Важно помнить, что level.ai нужно обновлять для всех уровней, а не только для тех, которые подвергались правке.

Безлоговый вылет

Вылет, при котором лог отсутствует. Причины такого вылета:

1. Безлоговые вылеты бывают в основном из-за завышенных настроек видео.

Решение: В папке с игрой открыть папку gamedata, папку config, в ней файл alife, открыть любым текстовым редактором (блокнотом, или лучше word pad’ом) и найти строку switch distance = и изменить значение на 5, сохранить изменения. Это только одна (не сильно вероятная) причина безлогового вылета. если вы знаете ещё одну причину, пожалуйста напишите здесь.

Читайте также:  Генерация документов по шаблону в word

2. Вторая причина неправильно указано название пути в логике НПС или он полностью отсутствует в файле way_ all.spawn. Вылетать будет когда дойдёт время до спавна этого НПС.

3. Также, безлоговые вылеты происходят из-за ошибок в диалогах.

Причины вылетов игры (разбираем логи)

Привет всем! Игра сталкер, а конкретно сам движок X-ray довольно капризный, и зачастую как в процессе модификации, так и во время игры игра "вылетает". Чтобы мы знали причину вылета, движок нам оставляет лог вылета. Лог вылета можно посмотреть несколькими способами:
В текстовом редакторе нажать Ctrl+V (Вставить)
Посмотреть лог игры включая лог вылета в файле xray_имя_пользователя.log в папке C:Documents and SettingsAll UsersДокументыSTALKER-***logs
Посмотреть непосредственно в окне багтрекера (только в ЧН и ЗП).

Иногда при запуске своего приложения я получаю подобную ошибку:

Мне сказали, что это называется «трассировкой стека» или «stack trace». Что такое трассировка? Какую полезную информацию об ошибке в разрабатываемой программе она содержит?

Немного по существу: довольно часто я вижу вопросы, в которых начинающие разработчики, получая ошибку, просто берут трассировки стека и какой-либо случайный фрагмент кода без понимания, что собой представляет трассировка и как с ней работать. Данный вопрос предназначен специально для начинающих разработчиков, которым может понадобиться помощь в понимании ценности трассировки стека вызовов.

1 ответ 1

Простыми словами, трассировка стека – это список методов, которые были вызваны до момента, когда в приложении произошло исключение.

Простой случай

В указанном примере мы можем точно определить, когда именно произошло исключение. Рассмотрим трассировку стека:

Это пример очень простой трассировки. Если пойти по списку строк вида «at…» с самого начала, мы можем понять, где произошла ошибка. Мы смотрим на верхний вызов функции. В нашем случае, это:

Для отладки этого фрагмента открываем Book.java и смотрим, что находится на строке 16 :

Это означает то, что в приведенном фрагменте кода какая-то переменная (вероятно, title ) имеет значение null .

Пример цепочки исключений

Иногда приложения перехватывают исключение и выбрасывают его в виде другого исключения. Обычно это выглядит так:

Трассировка в этом случае может иметь следующий вид:

В этом случае разница состоит в атрибуте "Caused by" («Чем вызвано»). Иногда исключения могут иметь несколько секций "Caused by". Обычно необходимо найти исходную причину, которой оказывается в самой последней (нижней) секции "Caused by" трассировки. В нашем случае, это:

Аналогично, при подобном исключении необходимо обратиться к строке 22 книги Book.java , чтобы узнать, что вызвало данное исключение – NullPointerException .

Еще один пугающий пример с библиотечным кодом

Как правило, трассировка имеет гораздо более сложный вид, чем в рассмотренных выше случаях. Приведу пример (длинная трассировка, демонстрирующая несколько уровней цепочек исключений):

В этом примере приведен далеко не полный стек вызовов. Что вызывает здесь наибольший интерес, так это поиск функций из нашего кода – из пакета com.example.myproject . В предыдущем примере мы сначала хотели отыскать «первопричину», а именно:

Однако все вызовы методов в данном случае относятся к библиотечному коду. Поэтому мы перейдем к предыдущей секции «Caused by» и найдем первый вызов метода из нашего кода, а именно:

Оцените статью
Добавить комментарий

Adblock
detector