Выявление причин вылетов без лога — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
Skyloader (обсуждение | вклад) (Новая страница: «Этот метод может помогать выявить некоторые стабильные или нестабильные (если у вас терпе...») |
|||
(не показаны 7 промежуточные версии 6 участников) | |||
Строка 1: | Строка 1: | ||
Этот метод может помогать выявить некоторые стабильные или нестабильные (если у вас терпения хватит) безлоговые вылеты. Сам пользуюсь методом, часто помогает. Скажу сразу, этот метод только для скриптеров, остальные не поймут, что в логе написано. | Этот метод может помогать выявить некоторые стабильные или нестабильные (если у вас терпения хватит) безлоговые вылеты. Сам пользуюсь методом, часто помогает. Скажу сразу, этот метод только для скриптеров, остальные не поймут, что в логе написано. | ||
− | Итак, будем изменять | + | Итак, будем изменять функцию ''printf()'' в файле '''_g.script'''. Смотрим ее и приводим к следующему виду: |
− | < | + | |
+ | <lua> | ||
function printf(fmt,...) | function printf(fmt,...) | ||
local con = get_console() | local con = get_console() | ||
Строка 7: | Строка 8: | ||
con:execute("flush") | con:execute("flush") | ||
end | end | ||
− | </ | + | </lua> |
− | Запускаем игру и играем/загружаем сейв. Игра будет тормозить, потому что в лог идет очень много информации. Делаем наше черное дело, при котором вылетаем, ну и | + | Таким образом, в лог принудительно пишется вся информация, идущая в консоль в процессе игры. |
+ | |||
+ | Запускаем игру и играем/загружаем сейв. Игра будет тормозить, потому что в лог идет очень много информации. Делаем наше черное дело, при котором вылетаем, ну и ловим вылет. Смотрим лог и видим, что в нем осталось последнее действие. | ||
---- | ---- | ||
После выявления вылета нам нужно все вернуть обратно, чтобы игра не тормозила и не засоряла лог. Просто закомментируем строки с ''execute'', чтобы было так: | После выявления вылета нам нужно все вернуть обратно, чтобы игра не тормозила и не засоряла лог. Просто закомментируем строки с ''execute'', чтобы было так: | ||
− | < | + | |
+ | <lua> | ||
function printf(fmt,...) | function printf(fmt,...) | ||
− | local con = get_console() | + | --local con = get_console() |
--con:execute(string.gsub(string.format(fmt,...), " ", "_")) | --con:execute(string.gsub(string.format(fmt,...), " ", "_")) | ||
--con:execute("flush") | --con:execute("flush") | ||
end | end | ||
− | </ | + | </lua> |
+ | |||
Вот, в принципе, и все. | Вот, в принципе, и все. | ||
+ | |||
+ | Кстати, таким образом можно узнавать причины вылетов с логом, ругающимся на '''_g.script'''. | ||
+ | |||
+ | '''Автор статьи: SkyLoader''' | ||
+ | |||
+ | ________________________________________________________________________ | ||
+ | В тени есть ещё 1 способ ,в | ||
+ | <lua> | ||
+ | function printf(fmt,...) | ||
+ | logf_console = get_console() | ||
+ | logf = logf_main | ||
+ | logf_main( fmt, ... ) | ||
+ | end | ||
+ | function logf_main( fmt, ... ) | ||
+ | local c = select( "#", ... ) | ||
+ | if c <= 0 then -- nothing to format | ||
+ | logf_console:execute( ":" .. string.gsub( fmt, " ", "\160" ) ) | ||
+ | else | ||
+ | logf_console:execute( ":" .. string.gsub( string.format( fmt, ... ), " ", "\160" ) ) | ||
+ | end | ||
+ | end | ||
+ | </lua> | ||
+ | |||
+ | [[Категория:Скрипты]] |
Текущая версия на 14:52, 7 января 2014
Этот метод может помогать выявить некоторые стабильные или нестабильные (если у вас терпения хватит) безлоговые вылеты. Сам пользуюсь методом, часто помогает. Скажу сразу, этот метод только для скриптеров, остальные не поймут, что в логе написано. Итак, будем изменять функцию printf() в файле _g.script. Смотрим ее и приводим к следующему виду:
function printf(fmt,...) local con = get_console() con:execute(string.gsub(string.format(fmt,...), " ", "_")) con:execute("flush") end
Таким образом, в лог принудительно пишется вся информация, идущая в консоль в процессе игры.
Запускаем игру и играем/загружаем сейв. Игра будет тормозить, потому что в лог идет очень много информации. Делаем наше черное дело, при котором вылетаем, ну и ловим вылет. Смотрим лог и видим, что в нем осталось последнее действие.
После выявления вылета нам нужно все вернуть обратно, чтобы игра не тормозила и не засоряла лог. Просто закомментируем строки с execute, чтобы было так:
function printf(fmt,...) --local con = get_console() --con:execute(string.gsub(string.format(fmt,...), " ", "_")) --con:execute("flush") end
Вот, в принципе, и все.
Кстати, таким образом можно узнавать причины вылетов с логом, ругающимся на _g.script.
Автор статьи: SkyLoader
________________________________________________________________________ В тени есть ещё 1 способ ,в
function printf(fmt,...) logf_console = get_console() logf = logf_main logf_main( fmt, ... ) end function logf_main( fmt, ... ) local c = select( "#", ... ) if c <= 0 then -- nothing to format logf_console:execute( ":" .. string.gsub( fmt, " ", "\160" ) ) else logf_console:execute( ":" .. string.gsub( string.format( fmt, ... ), " ", "\160" ) ) end end