From: Steven Rostedt <rostedt@xxxxxxxxxxx> In order to have tep_print_field() print the field closer to the way it is printed via the "pretty_print" method, all field args, must keep a pointer to the field it represents. Signed-off-by: Steven Rostedt (VMware) <rostedt@xxxxxxxxxxx> Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@xxxxxxxxx> --- Hi Steven, This version is still WORK IN PROGRESS! Changes in c2: A kprobe that is defined as: "p:open do_sys_openat2 file=+0($arg2):string flags=+0($arg3):x64 mode=+8($arg3):x64" will have the following printing format: "print fmt: "(%lx) file=\"%s\" flags=0x%Lx mode=0x%Lx", REC->__probe_ip, __get_str(file), REC->flags, REC->mode" In v2 I am trying to add propper handling of the "file" fieled (via "__get_str") of this particular probe. A solution for the general case still needs to be developed. Any ideas? Thanks! Yordan src/event-parse.c | 60 +++++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/src/event-parse.c b/src/event-parse.c index b0790d7..64ebed3 100644 --- a/src/event-parse.c +++ b/src/event-parse.c @@ -2334,12 +2334,12 @@ process_entry(struct tep_event *event __maybe_unused, struct tep_print_arg *arg, arg->type = TEP_PRINT_FIELD; arg->field.name = field; + arg->field.field = tep_find_any_field(event, arg->field.name); + if (is_flag_field) { - arg->field.field = tep_find_any_field(event, arg->field.name); arg->field.field->flags |= TEP_FIELD_IS_FLAG; is_flag_field = 0; } else if (is_symbolic_field) { - arg->field.field = tep_find_any_field(event, arg->field.name); arg->field.field->flags |= TEP_FIELD_IS_SYMBOLIC; is_symbolic_field = 0; } @@ -3103,7 +3103,7 @@ process_paren(struct tep_event *event, struct tep_print_arg *arg, char **tok) static enum tep_event_type process_str(struct tep_event *event __maybe_unused, struct tep_print_arg *arg, - char **tok) + char **field, char **tok) { enum tep_event_type type; char *token; @@ -3111,6 +3111,7 @@ process_str(struct tep_event *event __maybe_unused, struct tep_print_arg *arg, if (read_expect_type(TEP_EVENT_ITEM, &token) < 0) goto out_free; + *field = token; arg->type = TEP_PRINT_STRING; arg->string.string = token; arg->string.offset = -1; @@ -3285,59 +3286,66 @@ process_function(struct tep_event *event, struct tep_print_arg *arg, char *token, char **tok) { struct tep_function_handler *func; + int ret = TEP_EVENT_ERROR; + char *field = NULL; if (strcmp(token, "__print_flags") == 0) { - free_token(token); is_flag_field = 1; - return process_flags(event, arg, tok); + ret = process_flags(event, arg, tok); + goto done; } if (strcmp(token, "__print_symbolic") == 0) { - free_token(token); is_symbolic_field = 1; - return process_symbols(event, arg, tok); + ret = process_symbols(event, arg, tok); + goto done; } if (strcmp(token, "__print_hex") == 0) { - free_token(token); - return process_hex(event, arg, tok); + ret = process_hex(event, arg, tok); + goto done; } if (strcmp(token, "__print_hex_str") == 0) { - free_token(token); - return process_hex_str(event, arg, tok); + ret = process_hex_str(event, arg, tok); + goto done; } if (strcmp(token, "__print_array") == 0) { - free_token(token); - return process_int_array(event, arg, tok); + ret = process_int_array(event, arg, tok); + goto done; } if (strcmp(token, "__get_str") == 0) { - free_token(token); - return process_str(event, arg, tok); + ret = process_str(event, arg, &field, tok); + goto done; } if (strcmp(token, "__get_bitmask") == 0) { - free_token(token); - return process_bitmask(event, arg, tok); + ret = process_bitmask(event, arg, tok); + goto done; } if (strcmp(token, "__get_dynamic_array") == 0) { - free_token(token); - return process_dynamic_array(event, arg, tok); + ret = process_dynamic_array(event, arg, tok); + goto done; } if (strcmp(token, "__get_dynamic_array_len") == 0) { - free_token(token); - return process_dynamic_array_len(event, arg, tok); + ret = process_dynamic_array_len(event, arg, tok); + goto done; } if (strcmp(token, "__builtin_expect") == 0) { - free_token(token); - return process_builtin_expect(event, arg, tok); + ret = process_builtin_expect(event, arg, tok); + goto done; } func = find_func_handler(event->tep, token); if (func) { - free_token(token); - return process_func_handler(event, func, arg, tok); + ret = process_func_handler(event, func, arg, tok); + goto done; } do_warning_event(event, "function %s not defined", token); + + done: + if (field) + arg->field.field = tep_find_any_field(event, field); + free_token(token); - return TEP_EVENT_ERROR; + return ret; } static enum tep_event_type -- 2.30.2