EugeAl, игра сообщает адрес инструкции, которая крашнулась. Если ты не знаешь назначение кода, который там находится, то и понять причину краша не сможешь.
Вот пример разбора отчета об ошибке, вызваной передачей нативке Player параметра -1.
EugeAl, когда игра использовала уже уничтоженый объект нулевой строки, то пыталась вызвать у него виртуальный метод. Указатель на таблицу методов находится в начале структуры объектов. Так как для объекта уже был вызван деструктор, то таблица методов ссылалась на таблицу самого базового класса (в данном случае TRefCnt), у которого было лишь два метода, а нужно было вызвать метод класса наследника (CStringRep), у которого нужный метод шел третим.
Индекс 2 (отсчёт идёт с нуля) выходит за границы таблицы методов TRefCnt и указывает на случайную память за ним, а в данном случае ею оказалось число 0x35800000, или 1.0f.
Дальше управление передается по этому адресу, но обычно там нет инструкций для исполнения и игра крашится.
Игра неправильно пишет сообщение об ошибке, когда происходит ошибка исполнения, а не чтения/записи. В таком случае она пишет "written", но не стоит обманываться. Адрес инструкции, которая "читала" и памяти, в которую "писали", указывается один и тот же.
Инструкция по адресу 0x35800000 пыталась перзаписать память по адресу 0x35800000 — на самом деле означает, что было передано управление по адресу 0x35800000, на целевой адрес не содержит исполняемой памяти.
Была попытка получить поле "version" для нестандартной способности 'ACcv', родитель которой имел ИД 0, из-за чего и произошел краш.
Вот только, это стандартная способность "Девятый вал", незнаю, почему её вдруг начали считать нестандартной и полезли искать её несуществующую основу.
В карте есть одна нестандартная способность на её основе с ИД 'A093'.
Возможно, программа сгенерировала некорректный "war3map.w3a" файл.
А проблема только в иконке? или что-то не работает?
Кнопка нажимается, цель выбирается, так что всё работает.
Проблема в том, что в текстовых файлах отсутствует информация о пути к иконке, описание и координаты кнопки.
EugeAl, для хранения текста с требованиями используется короткое описание, которое обычно вмещает до 256 байт, но даже это пространство не используется полностью, так как игра обрезает строку до 128 байт.
Пускай мод и расширил лимит — это не помогло, ведь игра даже старый не задевала.
EugeAl, насколько я помню, варкрафт проверяет начало SLK файла на соответствие строке ID;PWXL;N;E и, если она отличается, то бракует входной файл.
В ней содержится информация о программе, которая сохранила файл и какие-то дополнительные флаги. Если работа велась в другой программе или не той версии, то игра может отказаться работать с таблицей.
EugeAl, какой бы длины не была строка, которую игра помещает в кнопку — она поместится.
Вопрос лишь в том, не обрежет ли её кто-нибудь на ранних стадиях. Если до кнопки дойдет только обрывок текста, то этот мод не поможет.
Tredor46, это баг варкрафта, а не конкретной карты. Если есть триггеры, реагирующие на приказ, то создается объект с данными о событии, но затем не уничтожается.
То что вылетает у тебя, вовсе не означает что вылетает у других.
Если проблемы с твоим оборудованием, то смена версии карты тебе не поможет.
В случае вопросов о крашах стоит прикладывать отчет об ошибке, создаваемый игрой в папке Errors и имеющий имя %Дата краша%.txt, тогда есть вероятность, что кто-нибудь сможет по нему понять причину.
Убедись в том, что у тебя исправный компьютер (из корпуса не идёт дыма), с операционной системой всё в порядке (синие экраны появляются разве что в страшных снах) и в папке с игрой нет файлов с расширением .mix (это исполняемые файлы, которые игра подгружает на старте и они могут сделать с игрой и компьютером что угодно).
Если крашится с нехваткой памяти, то дело может быть в утечках памяти создаваемых картой, что должен исправлять разработчик.
Но бывает такое, что утечек карта не создает, а память всё равно куда-то улетучивается.
Как я подозреваю, из-за кривых драйверов для видеокарт, которые позволяют памяти течь, либо неэкономно используют её.
В таком случае, можешь попробовать:
Запустить игру в режиме OpenGL (передав параметр командной строки "-opengl"), вроде некоторым это помогает.
Переключиться на DirectX 9, скинув d3d8.dllотсюда в папку с игрой (незнаю, может ли это действительно помочь).
Обновить/откатить версию видеодрайверов.
Пойти играть на Linux'е под Wine'ом. Вероятно, там будут другие версии драйверов, если повезет, то без багов.
Поменять видеокарту на другую.
Если проблема всё же в карте, то начни перебирать все версии, одну за другой, пока не найдешь исправную (если таковая имеется).
Я загрузил скриншот и поставил галочку "Вставить изображения в текст", но похоже что-то пошло не так. Ресурс редактировать почему-то нельзя, поэтому попробую снова через комментарий.
makkad, этот мод модифицирует код игры таким образом, что при попытке добавить на панель приказов команду с координатами, выходящими за пределы сетки, такой запрос будет попросту отклонен и кнопка не появится в игровом интерфейсе.
Конечно, лучше если карта изначально будет сделана правильно, но если захочется поиграть в какую-нибудь карту с кривыми координатами кнопок, но при этом не хочется заморачиваться с ручной правкой архива, то это решение может помочь.
Не знаю на сколько он действительно помогает, ведь ты не поделился информацией о том, каковы значения потребления памяти процессом до и после, но раз ты так говоришь, то поверю на слово.
В таком случае, пользуйся этим решением и дальше, чтобы сбрасывать утечки памяти, создаваемые непонятно кем (я подозреваю видеодрайвера).
Надеюсь, это позволит тебе играть неограничено долго.
Если в карте и правда есть такие баги, то это печально. Я бы мог посмотреть, где там автор накосячил, но не уверен, что смогу найти на это время, тем более, что сам я в эту карту не играю.
Было бы удобнее, если бы ты отсортировал таблицу по колонке "Count", которая отображает количество агентов, но и так уже сойдет.
Не вижу чтобы каких-нибудь агентов было слишком много. Похоже, что группы утекают, но их количество не смертельно.
Нужно было отсортировать список по колонке с количеством объектов и либо сделать скриншот окна, в котором видно самые многочисленые виды агентов, либо скопировать текст всех ячеек и залить сюда файл.
Тогда можно было бы проверить, не утекает ли там что-то слишком сильно.
Менеджер памяти игры утверждает, что занял меньше 400 мегабайт, что не так уж и много.
Может быть, фрагментация памяти слишком велика или кто-то еще (например, драйвера для видеокарты) занял всю память.
Попробуй переключиться на OpenGL или DirectX 9 и сравни потребление памяти.
Еще, если проблема в утечках памяти, вызваных не варкрафтом, то может помочь периодический перезапуск игры и загрузка сохранения. Посмотри сколько памяти игра занимает в момент сохранения и после загрузки.
Я так понимаю, речь идёт о краше из-за нехватки памяти. В карте, конечно, еще остались утечки, но не настолько критичные, чтобы играть было совсем невозможно. Я видел на иринаботе лобби с игроками, которые играли 2 часа.
Покажешь отсортированую по количеству объектов таблицу, показываему этой программой?
А еще не помешает отчет об ошибке, создаваемый игрой в папке Errors.
Бывают невезучие игроки, у которых карты постоянно крашатся с нехваткой памяти, в то время как остальные играют как ни в чём не бывало. Может у тебя варкрафт сломаный с модами кривыми или операционная система/драйвера глючат.
Еще слышал, что иногда помогает переключение игры в режим OpenGL передачей параметра командной строки "-opengl" (один человек утверждал, что в его карте потребление памяти отличалось на гигабайт).
Функция вывода в консоль крашится, если к программе не подключена консоль.
Краш-код
program my_first_program;
begin
WriteLn('Hello, World!'); // Ты пытался, но у тебя ничего не вышло.
end.
printf
При конструировании массива, который передается функциям с переменным числом аргументов, при передаче DWORD'а тот конвертируется в int32 и, если его значение вне диапазона 0..0x7FFFFFFF, то выкидывается исключение RangeError, которое приводит к крашу моих модов. Это происходит независимо от режима сборки (релиз/отладка) и состояния флага проверки ошибок диапазонов.
Remark: Note that there is no support for DWord (or cardinal) arguments in array of const. They are converted to vtInteger/vtLongint. This is for Delphi compatibility, and the compiler will ignore any resulting range checks when in mode Delphi.
В документации написано, что это сделано для совместимости с Delphi, но каким образом это (краши везде, кроме Delphi) способствует ей я так и не понял.
Пример кода с крашем
program omg;
uses
SysUtils;
var
number: Dword = 0xFFFFFFFF;
begin
WriteLn(Format('number = %d', [number])); // crash
end.
Этот код не в состоянии вывести в консоль значение переменной.
Исправляется ручным конвертированием значения в тип, который точно вместит в себя все его значения:
WriteLn(Format('number = %d', [Int64(number)]));
Память мертвого потока
При попытке освободить память, которая была выделена во время исполнения точки входа библиотеки, можно легко получить краш.
Происходит это в случае, если поток, во время исполнения которого была выделена память, уже завершился. Такое может произойти в случае, когда вместо помещения .mix файла в папку с игрой (тогда игра сама загрузит его и точка входа выполнится в главном потоке, который будет долго жить), используется инъектор DLL (в таком случае, в целевом процессе создается поток, который завершается сразу после загрузки библиотеки).
Вообще, в freepascal'е есть функция создания потока BeginThread которая, возможно, корректно обрабатывает завершение потока, перекладывая права владения на кого-нибудь другого, но поток в котором исполняется точка входа находится вне моей власти.
Для решения этой пролемы можно попробовать в точке входа сразу создавать новый поток через BeginThread и уже в нём выделять память, либо воспользоваться возможностью смены менеджера памяти (подключение модуля cmem самым первым в главном файле программы позволит использовать менеджер памяти из msvcr.dll).
Пример краш-кода
program dead_memory;
var
memory: Pointer;
procedure OnChatMessage(s: PChar);
begin
// ...
FreeMem(memory); // crash
end;
begin
memory:= GetMem(1024);
AddChatHandler(@OnChatMessage);
end.
quq_CCCP, значит не нашлось никого, кого бы это беспокоило достаточно сильно, чтобы тот был готов оплатить разработку нового мода. Сам я уже давно перестал зависать в варкрафте, но иногда ко мне приходят с просьбами сделать мод и я берусь, если задача мне по силам и оплата устраивает.
Но, как по мне, в данном случае проще перезапустить игру.
В файле "UI/FrameDef/UI/ScriptDialog.fdf" есть какие-то настройки для скриптового диалога и его кнопок, попробуй поиграться с ним.
Если умеешь делать хаки, то при помощи этой программы ты можешь увидеть список нативных функций и их адреса. Отредактируй функцию DialogDisplay и заглуши её, после чего сможешь больше не видеть никаких диалогов.
Правда, если ты играешь на платформе с античитом, то он может обратить внимание на модификацию игры.
» WarCraft 3 / Краш 0x35800000 при закрытии игры
» WarCraft 3 / Краш 0x35800000 при закрытии игры
Ред. IceFog
» WarCraft 3 / Краш 0x35800000 при закрытии игры
Дальше управление передается по этому адресу, но обычно там нет инструкций для исполнения и игра крашится.
Ред. IceFog
» WarCraft 3 / SLK оптимизация при помощи w3x2lni
Стектрейс следующий:
В карте есть одна нестандартная способность на её основе с ИД 'A093'.
» WarCraft 3 / SLK оптимизация при помощи w3x2lni
Проблема в том, что в текстовых файлах отсутствует информация о пути к иконке, описание и координаты кнопки.
Ред. IceFog
» WarCraft 3 / SLK оптимизация при помощи w3x2lni
Поиск в редакторе не находит её.
Ред. IceFog
» WarCraft 3 / Неограниченое описание
Пускай мод и расширил лимит — это не помогло, ведь игра даже старый не задевала.
Ред. IceFog
» WarCraft 3 / Добавление кастомных способностей в war3patch.mpq
» WarCraft 3 / Неограниченое описание
Ред. IceFog
» WarCraft 3 / Неограниченое описание
Вопрос лишь в том, не обрежет ли её кто-нибудь на ранних стадиях. Если до кнопки дойдет только обрывок текста, то этот мод не поможет.
» WarCraft 3 / Какая версия карты земли бога не вылетает?
Ред. IceFog
» WarCraft 3 / Какая версия карты земли бога не вылетает?
Если проблемы с твоим оборудованием, то смена версии карты тебе не поможет.
Как я подозреваю, из-за кривых драйверов для видеокарт, которые позволяют памяти течь, либо неэкономно используют её.
» Администрация XGM / Отсутствует короткое описание в ленте
» WarCraft 3 / Баги из-за сокрытия кнопок
А если собираться играть компанией, то можно договориться заранее всем поставить этот мод.
» WarCraft 3 / Баги из-за сокрытия кнопок
Ред. IceFog
» WarCraft 3 / Последнее убежище
Надеюсь, это позволит тебе играть неограничено долго.
Не вижу чтобы каких-нибудь агентов было слишком много. Похоже, что группы утекают, но их количество не смертельно.
» WarCraft 3 / Последнее убежище
Еще интересно, сколько памяти игра занимает на старте и как быстро она растет по мере игры.
Тогда можно было бы проверить, не утекает ли там что-то слишком сильно.
Может быть, фрагментация памяти слишком велика или кто-то еще (например, драйвера для видеокарты) занял всю память.
Ред. IceFog
» WarCraft 3 / Последнее убежище
А еще не помешает отчет об ошибке, создаваемый игрой в папке Errors.
Ред. IceFog
» WarCraft 3 / Открытая виртуальная машина
WriteLn
printf
Исправляется ручным конвертированием значения в тип, который точно вместит в себя все его значения:
Память мертвого потока
» WarCraft 3 / Открытая виртуальная машина
Прокрутить к ресурсу
» WarCraft 3 / Неограниченый размер карт без багов
Прокрутить к ресурсу
» WarCraft 3 / Секретные поля камеры
Объяви константы, скопировав себе в код следующие строчки:
Ред. IceFog
» WarCraft 3 / Что изменить в mpq чтоб грохнуть диалоги
» WarCraft 3 / Секретные поля камеры
Ред. IceFog
» WarCraft 3 / Что изменить в mpq чтоб грохнуть диалоги
Правда, если ты играешь на платформе с античитом, то он может обратить внимание на модификацию игры.