lua的代碼覆寫率工具
https://github.com/esrrhs/cluagithub.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
- 此時目錄下已有
檔案,然後用lcov的工具輸出htmltest.info
# genhtml test.info
- 打開目錄下的index.html如下
- 點選進入test.lua
- lcov還可以對info檔案進行合并,更多操作參考官方文檔
其他
lua的性能分析工具pLua