tools lib traceevent: Let filtering numbers by string use function names
Commit-ID: e84c282b40251f314c429f39b044785e323f2648 Gitweb: http://git.kernel.org/tip/e84c282b40251f314c429f39b044785e323f2648 Author: Steven Rostedt <[email protected]> AuthorDate: Tue, 22 May 2012 14:45:21 +0900 Committer: Namhyung Kim <[email protected]> CommitDate: Wed, 4 Jul 2012 13:40:30 +0900
tools lib traceevent: Let filtering numbers by string use function names
As a pointer can be converted into a function name, let the filters work with the function name as well as with the pointer number. If the comparison expects a string, then convert numbers into functions, but only when the number is the same size as a long.
Signed-off-by Steven Rostedt <[email protected]>
Signed-off-by Namhyung Kim <[email protected]>
--- tools/lib/traceevent/parse-filter.c | 45 +++++++++++++++++++++++++++------- 1 files changed, 35 insertions(+), 10 deletions(-)
tools/lib/traceevent/parse-filter.c +35 -10
@@ -1710,18 +1710,43 @@ static int test_num(struct event_format *event,static const char *get_field_str (struct filter_arg *arg,struct pevent_record *record) { -const char *val = record->data + arg->str.field->offset; +struct event_format *event; +struct pevent *pevent; +unsigned long long addr; +const char *val =NULL ; +char hex[64 ]; -/* -* We need to copy the data since we can't be sure the field -* is null terminated. -*/ -if (*(val + arg->str.field->size -1 )) { -/* copy it */ -memcpy (arg->str.buffer, val, arg->str.field->size); -/* the buffer is already NULL terminated */ - val = arg->str.buffer; +/* If the field is not a string convert it */ +if (arg->str.field->flags &FIELD_IS_STRING ) { + val = record->data + arg->str.field->offset; + +/* +* We need to copy the data since we can't be sure the field +* is null terminated. +*/ +if (*(val + arg->str.field->size -1 )) { +/* copy it */ +memcpy (arg->str.buffer, val, arg->str.field->size); +/* the buffer is already NULL terminated */ + val = arg->str.buffer; + } + + }else { + event = arg->str.field->event; + pevent = event->pevent; + addr =get_value (event, arg->str.field, record); + +if (arg->str.field->flags & (FIELD_IS_POINTER |FIELD_IS_LONG )) +/* convert to a kernel symbol */ + val =pevent_find_function (pevent, addr); + +if (val ==NULL ) { +/* just use the hex of the string name */ +snprintf (hex,64 ,"0x%llx" , addr); + val = hex; + } } +return val; }