![]() |
Programming in Lua | ![]() |
Part III. The Standard Libraries Chapter 23. The Debug Library |
The hook mechanism of the debug library allows us
to register a function that will be called at
specific events as your program runs.
There are four kinds of events that can trigger a hook:
call events happen every time Lua calls a function;
return events happen every time a function returns;
line events happen when Lua starts executing a new line of code;
and count events happen after a given number of instructions.
Lua calls hooks with a single argument,
a string describing the event that generated the call:
"call"
, "return"
, "line"
, or "count"
.
Moreover, for line events, it also passes a second argument,
the new line number.
We can always use debug.getinfo
to get more information
inside a hook.
To register a hook,
we call debug.sethook
with two or three arguments:
The first argument is the hook function;
the second argument is a string that
describes the events we want to monitor;
and an optional third argument is a number
that describes at what frequency we want to get count events.
To monitor the call, return, and line events,
we add their first letters (`c
´, `r
´, or `l
´)
in the mask string.
To monitor the count event,
we simply supply a counter as the third argument.
To turn off hooks,
we call sethook
with no arguments.
As a simple example, the following code installs a primitive tracer, which prints the number of each new line the interpreter executes:
debug.sethook(print, "l")It simply installs
print
as the hook function
and instructs Lua to call it only at line events.
A more elaborated tracer can use getinfo
to
add the current file name to the trace:
function trace (event, line) local s = debug.getinfo(2).short_src print(s .. ":" .. line) end debug.sethook(trace, "l")
Copyright © 2003-2004 Roberto Ierusalimschy. All rights reserved. |
![]() |
![]() |