天天看點

lua代碼格式化工具_lua的代碼覆寫率工具

lua的代碼覆寫率工具

https://github.com/esrrhs/clua​github.com

特性

  • 資料采集用C++編寫,性能更高,對宿主程序影響更小
  • 簡單require即可使用,或通過hookso注入
  • 解析器用go編寫,通過解析lua文法,精确計算檔案及函數的覆寫率
  • 支援輸出lcov格式,進而輸出html結果

編譯

  • 編譯libclua.so
# cmake .
# make
           
  • 編譯clua解析工具
# go get "github.com/milochristiansen/lua" 
# go build clua.go
           

使用

  • 直接嵌入lua腳本中使用,lua檔案裡使用如下
-- 加載libclua.so
local cl = require "libclua"
-- 開始記錄執行過程,生成結果檔案
-- 第一個參數為結果檔案的檔案名
-- 第二個參數為定時生成結果檔案的間隔(秒),0表示關閉
cl.start("test.cov", 5)

-- 執行某些事情
do_something()

-- 結束記錄
cl.stop()
           
  • 或者使用hookso注入到程序中(假設程序id為PID),手動開啟
a) 首先擷取程序中的Lua_State指針,比如程序調用了lua_settop(L)函數,那麼就取第一個參數
# ./hookso arg $PID liblua.so lua_settop 1 
123456

b) 加載libclua.so
# ./hookso dlopen $PID ./libclua.so

c) 執行libclua.so的start_cov手動開啟,等價于start_cov(L, "./test.cov", 5)
# ./hookso call $PID libclua.so start_cov i=123456 s="./test.cov" i=5

c) 執行libclua.so的stop_cov手動關閉,等價于stop_cov(L)
# ./hookso call $PID libclua.so stop_cov i=123456
           
  • 執行完上述兩種方法的任一一種,用clua解析test.cov檢視結果。clua更多參數參考-h
# ./clua -i test.cov
           

示例

  • 運作test.lua
# lua5.3 ./test.lua
           
  • 檢視目錄下,已有test.cov檔案
# ll test.cov
           
  • 檢視結果,每行前面的數字表示執行的次數,空表示沒被執行,友善定位潛在bug。最後幾行顯示了總體覆寫率,以及每個函數的覆寫率
# ./clua -i test.cov     
total points = 27, files = 1
coverage of /home/project/clua/test.lua:
    local cl = require "libclua"
    cl.start("test.cov", 5)
    
1   function test1(i)
10      if i % 2 then
10          print("a "..i)
        else
            print("b "..i)
        end
11  end
    
1   function test2(i)
40      if i > 30 then
19          print("c "..i)
        else
21          print("d "..i)
        end
41  end
    
1   function test3(i)
    
51      if i > 0 then
51          print("e "..i)
        else
            print("f "..i)
        end
    
52  end
    
    test4 = function(i)
    
        local function test5(i)
12          print("g "..i)
15      end
    
15      for i = 0, 3 do
12          test5(i)
        end
    
4   end
    
102 for i = 0, 100 do
101     if i < 10 then
10          test1(i)
91      elseif i < 50 then
40          test2(i)
        else
51          test3(i)
        end
    end
    
4   for i = 0, 2 do
3       test4(i)
    end
    
1   cl.stop()
    
/home/project/clua/test.lua total coverage 78% 22/28
/home/project/clua/test.lua function coverage [function test1(i)] 66% 2/3
/home/project/clua/test.lua function coverage [function test2(i)] 100% 3/3
/home/project/clua/test.lua function coverage [function test3(i)] 66% 2/3
/home/project/clua/test.lua function coverage [test4 = function(i)] 75% 3/4
/home/project/clua/test.lua function coverage [local function test5(i)] 100% 1/1
           
  • 也用lcov檢視
# ./clua -i test.cov -lcov test.info
           
  • 此時目錄下已有

    test.info

    檔案,然後用lcov的工具輸出html
# genhtml test.info
           
  • 打開目錄下的index.html如下
lua代碼格式化工具_lua的代碼覆寫率工具
  • 點選進入test.lua
lua代碼格式化工具_lua的代碼覆寫率工具
  • lcov還可以對info檔案進行合并,更多操作參考官方文檔

其他

lua的性能分析工具pLua