PDA

Просмотр полной версии : Мод вылетает в винду на определенном ходу



kabjans
24.11.2009, 20:43
ПОМОГИТЕ! Мод вылетает в Винду на определенном ходе.

В разработке мода "1492: Глобальная Колонизация" возникла серьезная проблема. Очень требуется помощь специалиста.

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

Описание предыдущих действий и собственно проблемы.

По сравнению с оригинальной Колонизацией в мод "1492: Глобальная Колонизация" введены новые ресурсы. Если в оригинальной версии их было 16, то сейчас ресурсов 30.

При введении новых ресурсов были внесены изменения лишь в 4 исходных файла CvCityAI.cpp, CvEnums.h, CvPlayerAI.cpp и CyEnumInterface.cpp.

В CyEnumsInterface.cpp это выглядит так:

[SPOILER]
[code]

kabjans
25.11.2009, 23:19
<div class='quotetop'>Цитата(kabjans * 24.11.2009, 21:43) 315817</div>

ПОМОГИТЕ! Мод вылетает в Винду на определенном ходе.

В разработке мода "1492: Глобальная Колонизация" возникла серьезная проблема. Очень требуется помощь специалиста.

Вчера, когда надо было проверить работу винодела, мне пришлось прогонять мод на несколько большее количество ходов. Как оказалось 52 ход прошел как обычно, без сбоя, а вот на 53-ем был сбой и вылет в винду
[/b]
После двух дней работы над "телом больного" запустил скорректированную версию мода.

52, ....53!!! :applau2: , 54, 55 ..... 100, .... 150, .....200, ...... 250, ..... 300! Полет нормальный!

Далее 301 хода проверить не смог, так как я стоял на начальной клетке, а мои оппоненты естественно нет и один из них объявил независимость. Впрочем, я на него не в обиде....

Тему можно закрывать.

Папа
26.11.2009, 01:02
Хорошо, что хорошо кончается! :yes:

kabjans
26.11.2009, 14:39
<div class='quotetop'>Цитата(papa1 * 26.11.2009, 2:02) 315977</div>

Хорошо, что хорошо кончается! :yes:
[/b]
И не говори, я уж думал, что мод погиб еще толком не родившись. "Радовало" только одно - то что, ошибка почему-то была именно на одном и том же ходу. Именно это вселяло надежду, что выловить баг все же удастся.

Собственно именно поэтому я и обратился к форумчанам тут и на их-фанатиках с просьбой помочь, при этом продолжая поиски решения своими силами. Поскольку с программированием у меня просто никак, то использовал то, что было под рукой: CodeBlocks и Notepad++. И немного логики.

Решение (http://forums.civfanatics.com/showpost.php?p=8674134&postcount=4) удалось найти за пару дней. Программист конечно решил бы эту проблему быстрее, но на то он и профессионал. А для дилетанта и 2 дня прекрасный результат. Так что можно продолжать работу над модом...

Хальк Юсдаль
07.12.2009, 18:03
Очень полезная тема, я благодаря описанному выше способу выяснения проблемы и борюсь с вылетами. Правда пришлось намаяться с установкой программ, но в итоге получилось.

NeseryozniyVET
20.03.2010, 15:32
<div class='quotetop'>Цитата(kabjans * 24.11.2009, 19:43) 315817</div>
<div class='quotetop'>Цитата
Make sure this line is changed in your ini

; Create a dump file if the application crashes
GenerateCrashDumps = 1[/b]
ОК, сделал Colonization.exe.dmp файл.

Далее уже в другом сообщении (http://forums.civfanatics.com/showpost.php?p=8143284&postcount=2) нашел совет установить Debugging Tools for Windows (WinDbg) и

<div class='quotetop'>Цитата</div>
If it is popping up the screen asking if you want a full or normal crashdump, then get WinDbg and your problems MAY resolve a bit quicker. Sometimes this will manage to point you right to the line of the DLL causing you problems.

Install that, get a crash to happen, then load WinDbg, hit CTRL+D, find the crashdump, and then type "!analyze -v" and it should inform you of what it knows.[/b]
Скачал и установил WinDbg, затем прогнал через него Colonization.exe.dmp.[/b][/quote]А как пользоватся этим WinDbg?
Я открыл через WinDbg свой BtS.exe.dmp а там каракули какие-то :boo:

kabjans
25.03.2010, 21:06
<div class='quotetop'>Цитата(NeseryozniyVET * 20.3.2010, 16:32) 329368</div>

А как пользоватся этим WinDbg?
Я открыл через WinDbg свой BtS.exe.dmp а там каракули какие-то :boo:
[/b]
1. Open WinDbg program.
2. Press CTRL-D. Now you see the directory where your Dump file is located.
3. Open your crash dump file.
4. On line after 0:000> print:
!analyze -v
5. Press Enter and wait about 1 minute.
6. On command screen read the report about your crash.

NeseryozniyVET
04.04.2010, 12:49
Кстате, WinDbg помог найти баг. :win:
Ситуация такая. После очередной кампиляции ДЛЛ игра стала вылетать. После анализа дампа WinDbgом, он выдал текс в котором часто упоминалось CvFeatureInfo::getYieldChange. Это описание функции getYieldChange класса CvFeatureInfo(лес, джунгли, пойма, оазис). Но я там ничего не менял!! :shock: И я стал думать. Спустя пару минут я вспомнил, что копаясь в файле CvPlayerAI.cpp, в функции AI_foundValue (вычисляет привлекательность тайла для постройки города) я добавил несколько строк в числе которых были:

eFeature = pPlot->getFeatureType(); // Тип феатуры на тайле
int iFeatureFood = GC.getFeatureInfo(eFeature).getYieldChange(YIELD_FOOD); // Количество добавочной еды от феатурыВыражение GC.getFeatureInfo(eFeature).getYieldChange(YIELD_FOOD) -- это и есть обращение к CvFeatureInfo::getYieldChange и по уверению WinDbgа збой происходит там. Но там все правильно! И я опять стал думать (второй раз за день :umnik: ). Через некоторое врем я понял: что там все правильно только если на тайле есть феатура, а если ее нет, то вторая строка будет искать количество еды у непонятно чего. Чтоб это исправить перед ней надо было поставить условие if (eFeature != NO_FEATURE)
eFeature = pPlot->getFeatureType(); // Тип феатуры на тайле
if (eFeature != NO_FEATURE) //ели на тайле есть феатура
{
int iFeatureFood = GC.getFeatureInfo(eFeature).getYieldChange(YIELD_FOOD); // Количество добавочной еды от феатуры
...
}
После кампиляции и запуска сэйва вылеты исчезли!!! :.V.:
:bayan: :bayan: :bayan: :bayan: :bayan: :bayan: :bayan: :bayan:

NeseryozniyVET
18.04.2010, 07:08
Разобрался как искать баги.
После анализа дампфайла ищем что-то вроде этого
[code]STACK_TEXT:

kabjans
20.04.2010, 16:08
Очень полезные пояснения. Теперь поиск ошибок становится более целенаправленным.

И если продолжить с примерами, то такого типа ошибка


CvGameCoreDLL!CvProfessionInfo::getYieldEquipmentAmount+2
связана с ошибкой в SDK, а такая


Colonization!initCvPythonExtensions+2944e1
с Python.

Правильно?

oooo4
09.05.2010, 17:55
Хочу вот тоже поделится своим опытом исправления ситуации "Мод вылетает в винду", возможно кому пригодиться

Моя ситуация несколько иная, чем описанная выше: редактирую я только xml настройки, но тем не мение удалось доредактироватся так, что игра схлопывалась не выдавая вооще никаких ошибок.

Вышеописанный способ с

; Create a dump file if the application crashes
GenerateCrashDumps = 1

не помог, никаких дампов мне не делалось (возможно потому, что никаких ошибок и не выдавалось)

Ситуация осложнялась тем, что я вносил много изменений, и понять где конкретно ошибка было невозможно. Нужно было методом анализа вычислить глюк. Вариантом досточно много, но действовать как то надо было.

Ошибка была на ходу компьютера. Значит, компьютер пытался что то сделать, что тянуло неправильные xml настройки. Первое, что я сделал это через редактор загнал шпионов в каждую из цивилизаций. Удалось выяснить кто какие науки открывает на злосчастном ходу и кто что строит. Впрочим, этого можно было и не делать, можно просто в редакторе нажать f6 и перебирая цивилизации смотреть кто что знает и открывает, а кто что строит будет видно и так. Немного поэкспериментировав, я вычислил одну науку и несколько городов, где на краш-ходу заканчивалось строительство. С наукой все было в порядке, она уже была открыта другими, значит глюк не в ней. Оставалось строительство, но это надо было подтвердить. Я стал удалять города с сомнительным строительством и в какой то момент игрушка пошла дальше.

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

oooo4
17.05.2010, 01:35
Вот, на еще один баг наткнулся, не знаю как починить.

На шарообразных картах (там где земле в виде планеты) в морских городах компьютер строит юнит (иногда строение) и перед тем как он должен появиться на карте, во время хода компа, игрушка вылетает в винду без описания ошибок. Никаких дампов памяти, годных для разборки игра не делает. Иногда бывает что уберешь через редактор бараки в городе, и краша не происходит, а потом комп снова строит бараки и снова краш. Я уже и юниты отключал и все такое, но ошибка упорно держится.

Что такое может отличать плоскую и шарообразную карту, что может быть краш при постройке юнитов в морских городах? Замучался уже сам ответ искать, может кто подкинет идейку какую куда копать?