XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Debug v2
Думаю многие помнят небольшую, но очень полезную библиотечку от Doc, которая помогала сохранять дебаг логи на хард по средствам прелоада. Думаю те кто пользовались остались довольны как и я.
Так вот недавно я ее малость усовершенствовал. надеюсь док будет не против
Теперь можно посмотреть и состояние памяти. Собсно код ниже:
» код
#define
{
    Debug = true
    private SavePath = NS_SNW_LOGS\\Logs
    private PerformanceSavePath = NS_SNW_LOGS\\PerformanceLogs
    private SaveOnHardDrive = true
    private HardDriveLetter = C
    private AutoSaveLog = true
    private LogSavePeriod = 5.0
}


library DebugLog initializer DebugLogInit
{
    public bool EnableLogging = true
    private string array DebugLog
    private string array PerformanceDebugLog
    private int CurrentString = 0
    private int miliSeconds = 0
    private int Seconds = 0
    private int Minutes = 0
    private int Hours = 0
    private constant int StringLimit = 200
    
    private int pastVal = 0;
    private int PerformanceString = 0
    
    void PerformanceLogAdd()
    {
        if (!EnableLogging)
        {
            return
        }
        string min = I2S(Minutes)
        string sec = I2S(Seconds)
        string msec = I2S(miliSeconds)
        if (Minutes < 10)
        {
            min = "0" + min
        }
        if (Seconds < 10)
        {
            sec = "0" + sec
        }
        if (miliSeconds < 10)
        {
            msec = "0" + msec
        }
        location loc = Location(0,0);
        int hId = GetHandleId(loc);
        
        RemoveLocation(loc);
        loc = null;
        PerformanceDebugLog[PerformanceString] = PerformanceDebugLog[PerformanceString] + ("[" + I2S(Hours)+":" + min + ":" + sec + ":" + msec + "] " + I2S(hId-0x100000) + "\n")
        if (StringLength(PerformanceDebugLog[PerformanceString]) >= StringLimit)
        {
            PerformanceString++
        }
    }
    
    void PerformanceLogUpdate()
    {
        if (!EnableLogging)
        {
            return
        }
        PreloadGenClear()
        PreloadGenStart()
        int i = 0
        while (i <= PerformanceString)
        {
            Preload("\")\n" + PerformanceDebugLog[i] + "\n(\"")
            i++
        }
        #if SaveOnHardDrive
            PreloadGenEnd(`HardDriveLetter` + ":\\" + `PerformanceSavePath` + ".txt")
        #else
            PreloadGenEnd("\\" + `PerformanceSavePath` + ".txt")
        #endif
    }
    
    void LogAdd(string s)
    {
        if (!EnableLogging)
        {
            return
        }
        string min = I2S(Minutes)
        string sec = I2S(Seconds)
        string msec = I2S(miliSeconds)
        if (Minutes < 10)
        {
            min = "0" + min
        }
        if (Seconds < 10)
        {
            sec = "0" + sec
        }
        if (miliSeconds < 10)
        {
            msec = "0" + msec
        }
        DebugLog[CurrentString] = DebugLog[CurrentString] + ("[" + I2S(Hours)+":" + min + ":" + sec + ":" + msec + "] " + s + "\n")
        if (StringLength(DebugLog[CurrentString]) >= StringLimit)
        {
            CurrentString++
        }
    }
    
    void LogClear()
    {
        int i = 0
        while (i <= CurrentString)
        {
            DebugLog[i] = ""
            i++
        }
        CurrentString = 0
    }
    
    void LogUpdate()
    {
        if (!EnableLogging)
        {
            return
        }
        PreloadGenClear()
        PreloadGenStart()
        int i = 0
        while (i <= CurrentString)
        {
            Preload("\")\n" + DebugLog[i] + "\n(\"")
            i++
        }
        #if SaveOnHardDrive
            PreloadGenEnd(`HardDriveLetter` + ":\\" + `SavePath` + ".txt")
        #else
            PreloadGenEnd("\\" + `SavePath` + ".txt")
        #endif
    }
    
    private void DebugLogOnTimer()
    {
        miliSeconds++
        if (miliSeconds > 99)
        {
            miliSeconds = 0
            Seconds++
            if (Seconds > 59)
            {
                Seconds = 0
                Minutes++
                if (Minutes > 59)
                {
                    Minutes = 0
                    Hours++
                }
            }
        }
    }

    private void DebugLogInit()
    {
        #if AutoSaveLog
            TimerStart(CreateTimer(), LogSavePeriod, true, function LogUpdate)
            TimerStart(CreateTimer(), LogSavePeriod, true, function PerformanceLogUpdate)
        #endif
        TimerStart(CreateTimer(), 0.01, true, function DebugLogOnTimer)
        TimerStart(CreateTimer(), 0.10, true, function PerformanceLogAdd)
        LogAdd("By FaionBezarius. Last compilation: " + `DATE` + " " + `TIME`)
	#if Debug 
        	BJDebugMsg("By FaionBezarius. Last compilation: " + `DATE` + " " + `TIME`)
	#endif
    }
    
}
Что собственно нового? Ну прежде всего добавлены миллисекунды, мне их очень не хватало :) Впрочем самая главная плюшка - это возможность узнать сколько хендлов на данный момент заюзано. Если грамотно оформить весь код, к примеру так:
» Пример:
function SetMaxHP takes unit u returns nothing
    #if Debug 
        LogAdd("SetMaxHP func")
    #endif
    SetUnitState(u, UNIT_STATE_LIFE,GetUnitState(u,UNIT_STATE_MAX_LIFE))
    #if Debug 
	LogAdd("SetMaxHP func end")
    #endif
endfunction
То можно не только узнать в каком месте вдруг код дал сбой, но узнать какая часть кода дает утечки, или просто жрет слишком много памяти. Так же рекомендуется использовать параноикам(таким как) и просто для проверки на утечность кода.
PS: У меня среднее значение ~7500 :)

Отредактировано Faion, 11.06.2012 в 02:44.
Старый 08.06.2012, 21:59
Doc

offline
Опыт: 63,163
Активность:
Ну норм в целом, идея неплохая.
Предлагали еще добавить модули, типа чтобы одним дефайном ловить приказы, чат итд итп. Я начал делать но забил =)
BJDebugMsg("By FaionBezarius. Last compilation: " + `DATE` + " " + `TIME`)
эт зря, лучше убрать =)
Старый 09.06.2012, 01:26
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Faion, да прикольная идея, но лично я с начало проверяю 1 кусок кода на работоспособность, потом берусь за другой...
Старый 09.06.2012, 04:26
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Doc:
Предлагали еще добавить модули, типа чтобы одним дефайном ловить приказы, чат итд итп. Я начал делать но забил =)
Думаю такая фича была бы полезна. Но имхо над написать дебаг-препроцессор. Который при компиляции будет оборачивать нужную выбранную область в подробный дебаг автоматически:)
Doc:
эт зря, лучше убрать =)
Зачем? Я вот к примеру запускаю тестирование не через редактор, так как несколько раз запарывал мапу, запуская через ВЕ, А по этому очень помогает порой, сразу видно, не забыл ли пересохранить. и вообще ту ли версию запустил:)
quq_CCCP:
Faion, да прикольная идея, но лично я с начало проверяю 1 кусок кода на работоспособность, потом берусь за другой...
Даже если в 1 момент времени, после проверки все норм, это не значит что код всегда будет стабильным, в особенности это касается сложных взаимосвязанных систем.
А вообще если правильно проставить дебаг месседжи, то можно будет всегда узнать состояние каждой части.
PS: коллеги, давайте светите свои показатели заюзанности памяти, интересно же:)
Старый 09.06.2012, 10:50
J64_

offline
Опыт: 4,724
Активность:
Faion:
hId-0x100000
Так выводить не совсем верно.
Нужно выводить хэндл объекта минус хэндл первого объекта, созданного в начале игры (до вызова InitBlizzard), плюс один.
Старый 09.06.2012, 11:44
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Judycaster64:
Нужно выводить хэндл объекта минус хэндл первого объекта, созданного в начале игры (до вызова InitBlizzard), плюс один.
Это не может быть верным или не верным, у каждого свои "требования". Кому то нужно смотреть состояние после прогрузки систем, кому то после прогрузки близИнит, но в целом суть не меняется, так как нам нужны сведения о состоянии памяти, т.е. сколько заюзано, сколько нет, при срабатывании каких функций\систем\способностей возникают утечки и прочее. А так каждый желающий может заменить 0x100000 на первое значение в логе, и получить более "красивые" результаты.
Старый 09.06.2012, 12:07
Doc

offline
Опыт: 63,163
Активность:
тогда стоит поставить ключевое слово debug перед строчкой с выводом сообщения.
Старый 10.06.2012, 22:25
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Согласен. Добавил.
Старый 11.06.2012, 02:44
ScorpioT1000
Работаем
offline
Опыт: отключен
xgm.ru/forum/showthread.php?t=55766 мир вам, модмейкеры)
Старый 14.06.2012, 16:30
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 16:09.