Добавлен , опубликован
Предназначение:
Бывает такое, что при каждом закрытии игра начинает крашиться с таким окном:
Есть два способа решить проблему.

Способ 1: почистить реестр

Нужно удалить элемент, в значении которого написано: IgnoreFreeLibrary<Game.dll>.
На самом деле варкрафт всегда крашится при выходе, даже когда не видно окна с ошибкой.
Просто обычно он не обращает внимание на эту проблему, так как находится в состоянии завершения работы.
Но если Windows что-то взбредет в голову, то он может добавить некую запись в реестр и из-за этого краш перестает тихо игнорироваться.

Способ 2: установить исправляющий мод

Архив с модом прикреплен к ресурсу. Киньте .mix файл в папку с игрой.
Мод затирает деструктор глобальной переменной, из-за чего та удалится лишь один раз, когда счетчик ссылок упадет до нуля.

Причина

В варкрафте есть объект, олицетворяющий нулевую строку, находящийся в статической памяти. При завершении процесса, все подобные объекты уничтожаются один за другим.
На эту строку ссылаются другие объекты, и за каждый такой объект счетчик ссылок в строке увеличивается на единицу. Когда счетчик ссылок падает до 0 строка уничтожается.
Проблема в том, что сначала при уничтожении статических объектов, уничтожается нулевая строка, а затем, когда уничтожаются прочие объекты, ссылающиеся на строку, счетчик в конце концов падает до нуля и строка уничтожается повторно.
Попытка взаимодействия с мертвым объектом приводит к крашу.
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
На самом деле варкрафт всегда крашится при выходе, даже когда не видно окна с ошибкой
И этот косяк никто из близов даже не подумал исправлять? Ну и дичь
Вопрос попутный кстати. Вот это число 0х35800000, по такому числу можно ли как то навскидку примерно понять, из за чего игра крашнулась при входе/в процессе игры? Например кривой код, где вызван Player(-1), итд итп, или неправильно поставлено значение в slk, или fdf файл кривой/отсутствует
Мб какая нибудь закономерность в номерах есть?
Ответы (4)
19
EugeAl, когда игра использовала уже уничтоженый объект нулевой строки, то пыталась вызвать у него виртуальный метод. Указатель на таблицу методов находится в начале структуры объектов. Так как для объекта уже был вызван деструктор, то таблица методов ссылалась на таблицу самого базового класса (в данном случае TRefCnt), у которого было лишь два метода, а нужно было вызвать метод класса наследника (CStringRep), у которого нужный метод шел третим.
Индекс 2 (отсчёт идёт с нуля) выходит за границы таблицы методов TRefCnt и указывает на случайную память за ним, а в данном случае ею оказалось число 0x35800000, или 1.0f.
Дальше управление передается по этому адресу, но обычно там нет инструкций для исполнения и игра крашится.
Игра неправильно пишет сообщение об ошибке, когда происходит ошибка исполнения, а не чтения/записи. В таком случае она пишет "written", но не стоит обманываться. Адрес инструкции, которая "читала" и памяти, в которую "писали", указывается один и тот же.
Инструкция по адресу 0x35800000 пыталась перзаписать память по адресу 0x35800000 — на самом деле означает, что было передано управление по адресу 0x35800000, на целевой адрес не содержит исполняемой памяти.
23
IceFog, Спасибо. В общем как я понял, без знания исходного кода, имён всех этих классов, методов итд, не получится по этой цифре понять, почему игра слетела? То есть где именно отсутствует/неправильный объект/значение?
Насчёт 0023: понятно, что это, теперь.
19
EugeAl, игра сообщает адрес инструкции, которая крашнулась. Если ты не знаешь назначение кода, который там находится, то и понять причину краша не сможешь.
Вот пример разбора отчета об ошибке, вызваной передачей нативке Player параметра -1.
23
IceFog, ну вот это уже прояснило. В теории можно в тех трех строчках дампа памяти, где красное, посмотреть, и перевести эти 0хFFFFFF итп, в число и посмотреть, нет ли какой подозрительной цифры там, вроде -1 итд.
Но, я так понял, далеко не всегда это поможет.
Ладно, спасибо.
А вот прогеры близов они что, могли прямо читать бегло всю вот эту абракадабру из цифр в дампе и понимать, что там написано?😰
10
На самом деле варкрафт всегда крашится при выходе, даже когда не видно окна с ошибкой.
Интересно стало: это касается только warcraft 3 или других игр/программ тоже?
Ответы (2)
19
Если программа написана таким образом, что она крашится при выходе, то да.
15
Интересно на самом деле. Даже не знал о таком. Ну кстати и ни разу и не сталкивался с фаталом именно при закрытии игры. Вот близзы-приколисты...
16
Маленькая индия компания в своем духе. А автору респект
Чтобы оставить комментарий, пожалуйста, войдите на сайт.