Luci 디버그 및 분석 방법

3097 단어 openwrt
최근에 루시 코드를 깊이 있게 분석해 봤습니다. 솔직히 처음 봤을 때도 구름 속, 특히 디스패치 함수를 참고해 주셔서 감사합니다.
처음에 luci 코드는 확실히 역방향과 다를 것이 없기 때문에 작가가 각 변수에 대한 용도를 추측해야 한다. 그래서 나는 모든 변수를 인쇄하는 방법을 생각했다.
이를 위해/usr/lib/lua/luci 디렉터리에log를 도입했습니다.lua 모듈:
local M = {}

local tconcat = table.concat  
local tinsert = table.insert  
local srep = string.rep

local function local_print(str)  
    local dbg = io.open("/tmp/luci.output", "a+")
    local str = str or ""
    if dbg then
        dbg:write(str..'
') dbg:close() end end function M.print(...) local dbg = io.open("/tmp/luci.output", "a+") if dbg then dbg:write(os.date("[%H:%M:%S]: ")) for _, o in ipairs({...}) do dbg:write(tostring(o)..' ') end dbg:write("
") dbg:close() end end function M.print_r(data, depth) local depth = depth or 3 local cstring = ""; local top_flag = true local function table_len(t) local i = 0 for k, v in pairs(t) do i = i + 1 end return i end local function tableprint(data,cstring, local_depth) if data == nil then local_print("core.print data is nil"); end local cs = cstring .. " "; if top_flag then local_print(cstring .."{"); top_flag = false end if(type(data)=="table") then for k, v in pairs(data) do if type(v) ~= "table" then if type(v) == "string" then local_print(cs..tostring(k).." = ".."'"..tostring(v).."'"); else local_print(cs..tostring(k).." = "..tostring(v)); end elseif table_len(v) == 0 then local_print(cs..tostring(k).." = ".."{}") elseif local_depth < depth then local_print(cs..tostring(k).." = {"); tableprint(v,cs,local_depth+1); else local_print(cs..tostring(k).." = ".."{*}") end end else local_print(cs..tostring(data)); end local_print(cstring .."}"); end tableprint(data,cstring,0); end return M

luci 디렉터리 아래 어느 곳에서든 호출할 수 있습니다
local log = require "luci.log"  
log.print("Hello World")  
log.print_r({"Hello", "World"})  

또한log 모듈은/tmp/luci.ouput 아래에서tail 명령으로 추적할 수 있습니다.
# tail -f /tmp/luci.output

그래서 이 작은 모듈을 통해 오픈워터의 유명한 프로그램을 엿볼 수 있었다.정말 재미있어요. 시간이 있으면 루시 프레임워크 분석을 상세하게 적어 놓을게요.
또한luci 프로그램은 자체적으로 debug 모듈을 가지고 있습니다. 이것은 메모리의 점용 상황을 분석하는 모듈입니다. 디스패치에서도 사용할 수 있습니다.lua 모듈에서 열립니다.그것의 정보는/tmp/memtrace에 기록되어 있습니다.

참고 자료

  • Luci 구현 프레임워크
  • Luci tutorials
  • 와이파이독이 OpenWrt 라우터에 LuCI 모듈 추가
  • ... 에서 벗어나다https://forestgump.me/2015/03/28/luci-debug/

    좋은 웹페이지 즐겨찾기