Выявление причин вылетов без лога — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

Выявление причин вылетов без лога — различия между версиями

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск
м
 
(не показаны 4 промежуточных версий 4 участников)
Строка 10: Строка 10:
 
</lua>
 
</lua>
  
Таким образом, в лог принудительно (''flush'') пишется (''execute'') вся информация, идущая в консоль в процессе игры.
+
Таким образом, в лог принудительно пишется вся информация, идущая в консоль в процессе игры.
  
 
Запускаем игру и играем/загружаем сейв. Игра будет тормозить, потому что в лог идет очень много информации. Делаем наше черное дело, при котором вылетаем, ну и ловим вылет. Смотрим лог и видим, что в нем осталось последнее действие.
 
Запускаем игру и играем/загружаем сейв. Игра будет тормозить, потому что в лог идет очень много информации. Делаем наше черное дело, при котором вылетаем, ну и ловим вылет. Смотрим лог и видим, что в нем осталось последнее действие.
Строка 20: Строка 20:
 
<lua>
 
<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")
Строка 31: Строка 31:
  
 
'''Автор статьи: SkyLoader'''
 
'''Автор статьи: 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
 
Другие места
LANGUAGE