碧血红天的HomePage

杂谈 — Lua中hook的妙用

最近发现一个在lua中,这个hook还真有很大用处。比如,我想知道某个函数执行的时候都能调用一个我的函数,这样我能统计函数执行的个数和执行的时间了。这样分析Lua中函数执行耗时情况。

这里,我们谈谈如何使用hook。首先上一段代码

StartCallNames = {}
EndCallNames = {}

function test1()
	local sum = 0
	for i = 1,100000 do
		sum = sum + i
	end
	test2()
end

function test2()
	local sum = 0
	for i = 1,1000000000 do
		sum = sum + i
	end
end	

function start_hook(env)
	local f = debug.getinfo(2,"f").func
	if env == "call" then
		if StartCallNames[f] == nil then
			StartCallNames[f] = {}
			StartCallNames[f].time = os.clock()
			StartCallNames[f].Count = 1
		else
			if StartCallNames[f].Count == 0 then
				StartCallNames[f].time = os.clock()
			end
			StartCallNames[f].Count = StartCallNames[f].Count + 1
		end	
	elseif env == "return" then
		if StartCallNames[f] == nil or StartCallNames[f] == 0 then
			EndCallNames[f] = "Call Error"
		else
			StartCallNames[f].Count = StartCallNames[f].Count - 1
			if StartCallNames[f].Count == 0 then
				EndCallNames[f] = debug.getinfo(2,"Sn").name .." : "..tostring(os.clock() - StartCallNames[f].time)
			end
			
		end	
	end
end


-- 开启hook
-- mask:r 函数在返回前调用hook
-- mask:c 函数在开始执行的时候调用hook
-- mask:l 每执行一行语句都调用hook
-- 这里开启 r和c mask,这样在函数开始调用,和调用完成的时候执行
debug.sethook(start_hook,"rc")
test1()
-- 关闭hook
debug.sethook()

我们使用debug.sethook 开启hook,参数第一个是函数名字,第二个参数是mask,可选有r,c,l。mask可以多个值设置如我这里的rc。

我们可以使用debug.getinfo()来获取函数的信息,第一个参数有0,1,2.

  • 0:代笔getinfo函数本身
  • 1:代表hook函数
  • 2:代表当前执行的函数

获取的内容是个table,不知道有什么内容,可以自己实现一个TableToString函数来打印table内容,这样就知道有什么内容。

hook函数有一个返回参数,是一个字符串。有call 和 return分别代表在函数开始调用的时候和函数执行完成return 之前。

10 评论

  1. propecia Frontiers in neuroendocrinology 2011; 32 214 226

  2. It triggered heavy vaginal bleeding and incontinence, and also heart failure in an unlucky few nolvadex cream Piperine 12, Fig

  3. I will be doing ph only once so I don t think it will have that big of an effect on my liver propecia medication levitra tritace 2 5 skutki uboczne The dark haired, table flipping, word mangling stay at home mom somehow managed to parlay her lowbrow Italian schtick into a burgeoning brand, commanding advances of nearly 300, 000 for her best selling cookbooks and putting her name on a host of other products

  4. Most angiosarcomas are in or just under the skin signs clomid is working

  5. cialis online india 7 after treatment in Group A and 3

  6. buy zithromax liquid online New York City, from Jared Kushner Group for about 150 million in an all cash deal, the New York Post reported, citing unnamed sources

  7. Clin Otolaryngol Allied Sci 1989; 14 189 97 when does viagra peak

  8. В последните месеци на 2018 г. компанията придоби и обедини три големи вериги казино зали – Елдорадо Бет, Палмс и eCasino, за да създаде единен стандарт за качество, обединени джакпоти и бонус игри. Palms Merkur Royale Casino е новият още по – впечатляващ и луксозен проект, който се развива под шапката на веригата Palms Bet. Този петзвезден атрактивен комплекс ще бъде единствен по рода си в страната, като ще предлага на клиентите си всички разнообразни познати и непознати хазартни забавления. https://zanefxnc097542.mdkblog.com/18671434/слот-машини-безплатно В началото механизмът на действие на онлайн и физическите ротативки е бил един и същ, с еднакви символи, еднакви начини за залагане и еднакъв брой барабани. Но с всяка изминала година на пазара на хазартната индустрия се появяват все повече производители на слот игри, благодарение на които дизайнът и функциите на играта постоянно се усъвършенстват, за да става по-интересна и да привлича повече играчи. В Silentbet.com играта с истински пари не е възможна – тук ще имате възможност единствено да тествате демо версии, да подобрите осведомеността си и да се подготвите възможно най-добре за реалните залагания в лицензирани онлайн казина. Сигурни и надеждни дигитални казина, в които можете да играете пълните версии на ротативки с истински пари включват Efbet, Bet365, Winbet, Bwin и др.

发表评论