Customization of LKET
Li Guanglei
guanglei@cn.ibm.com
Fri Jun 2 03:19:00 GMT 2006
Frank Ch. Eigler ??:
> Li Guanglei <guanglei@cn.ibm.com> writes:
>
>> I had a talk with Jose last week and we think it would be useful to
>> make the user able to append extra data on the trace at script
>> level.
>
> It was this kind of flexibility in mind that I proposed the "compiled"
> binary tracing alternative in
> <http://sourceware.org/ml/systemtap/2006-q1/msg00277.html>. It was
> more recently been mentioned indirectly by Tom in
> <http://sourceware.org/ml/systemtap/2006-q2/msg00070.html>. This
> would be a more general solution to flexible & incremental
> construction of binary trace records.
>
Thanks. I will think about it.
>
>> Of course the user could modify the tapsets in tapset/LKET to let
>> _lket_trace() log more data. But it's not a convenient way. It's
>> obvious that a function like printf() at script level is better, i.e:
>> [...]
>> lket_trace_extra("%4b", $numa_node)
>> [...]
>> #define _lket_trace_extra(fmt, args...) do {\
>> _stp_printf("%1b%2n%0s"fmt, LKET_PKT_USER, fmt, args);\
>> } while(0)
>
> I must say I don't much like this approach. Is the only point
> here to add "LKET_PKT_USER" as a constant byte into the printf?
lket_trace_extra is actually a wrapper around printf. Actually the
user could directly use printf if he could remember to add
"%1b%2n%0s". LKET_PKT_USER and %2n is used by post-processing app to
properly found the boundary of the record. %0s(fmt) is also used by
post-processing app to correctly decode the user appended trace data.
So the reason I use lket_trace_extra() is that I want to hide
something from the user since I can't expect everyone following the
rules of adding extra data.
But I have to confess that it seems a waste to introduce such a new
function into systemtap's translator. It seems too application
specific. A more generic trace facilities at script level is more
meaningful.
Before we find the final solution, I think I can use a temp solution,
that is:
_lket_trace() add a magic number(4 or 8 bytes) at the beginning of
record to specify the boundary of every record.
The user can just use printf to add extra data, no LKET_PKT_USER
flag and %2n is needed. lket-b2a can simply dump all the extra data in
hex mode, or we introduce a function: register_eventhook(GRPID:long,
HOOKID:long, Format:string) for user to register the format of his
extra data. But I think the later seems better.
I am not sure this is a good idea but at least it won't need to
modify translator :-)
I am thinking of revert my changes of lket_trace_extra() to translator.
>
>> I modified systemtap to make it able to support lket_trace_extra at
>> script level. [...]
>
> Modify LKET tapset sources at will, but please consider
> application-specific changes to the translator proper as possibly
> controversial, and allow more time for review.
>
>
>> [...]
>> probe addevent.pagefault
>> {
>> lket_trace_extra("%4b%0s", $numa_node, backtrace())
>> }
>> But there is trouble that MAXSTRINGLEN is defined as 128 so backtrace
>> string will be truncated. Simply raising MAXSTRINGLEN will cause a lot
>> of waste of memory.
>
> It would be wise to test that assumption. Remember that the
> translator uses a statically allocated array for local values like
> string temporaries. Temporaries for adjacent statements are overlaid.
> The overall size of the context structure may be small enough even
> with a quadrupled MAXSTRINGLEN for it to work out fine. Test it and
> see.
I tested using a simple script:
function foo()
%{
_stp_printf("%d\n", sizeof(struct context));
%}
probe addevent.syscall.*
{
printf("%s\n", "aa")
foo()
}
it shows that the size of context will increase from 6608 to 51408 if
MAXSTRINGLEN is defined as 1024. Seems acceptable, right?
>
>
> - FChE
More information about the Systemtap
mailing list