可以在用户代码前后添加 sethook 函数,像这样:
local function hook(event_type)
ngx.say(event_type, ' ', debug.getinfo(2).name)
end
local level1 = loadstring([[
local function level3()
ngx.say("I am in level3")
end
local function level2()
level3()
end
level2()
]])
debug.sethook(hook, "cr")
level1()
debug.sethook()
$ curl localhost:8080
call level1
call level2
call level3
call say
I am in level3
return level3
return level2
return level1
call sethook
在这个粗糙的输出之上做些加工,应该能获取调用链和调用用时了。
在 2017年6月20日星期二 UTC+8上午9:41:04,cheng ye写道:
就是loadstring里面执行的是用户代码,
但是我想获取到用户在里面执行函数的调用链,而且想知道用户代码那些函数耗是比较严重的。
在 2017年6月19日星期一 UTC+8下午11:12:45,Zexuan Luo写道:获取不到,具体是什么情况呢?简单试了下,用 debug.traceback() 是可以的。
local level1 = loadstring([[
local function level3()
ngx.say(debug.traceback())
end
local function level2()
level3()
end
level2()]])
level1()
$ curl localhost:8080
stack traceback:
[string "..."]:3: in function 'level3'
[string "..."]:7: in function 'level2'
[string "..."]:10: in function 'level1'
./src/a.lua:12: in function <./src/a.lua:1>
在 2017年6月19日星期一 UTC+8下午7:35:24,cheng ye写道:
遇到个问题,我想获取lua函数的调用链,但是用loadstring执行产生的lua函数调用链获取不到,想问下大家有什么解决方法么。