ftrace: show ftrace_bprintk()'s formats
PATCH 4/5 ftrace: show ftrace_bprintk()'s formats
Impact: let user knows the format
Create a file on <debugfs-dir>/tracing/ to show ftrace_bprintk()'s formats.
This formats will help for these condition:
1) User get binary data from core file.(formats are backup before coredump)
2) User splice ring_buffer to a file.
User can use formats for parsing the binary data in userspace.
--- trace.c | 8 +++++ trace.h | 1 trace_bprintk.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+)
kernel/trace/trace.c +8 -0
@@ -2944,6 +2944,14 @@ static __init int tracer_init_debugfs(void)pr_warning ("Could not create debugfs " "'trace_marker' entry\n" ); +#ifdef CONFIG_TRACE_BPRINTK + entry =debugfs_create_file ("trace_bprintk_formats" ,0444 , d_tracer, +NULL , &trace_bprintk_fmt_fops); +if (!entry) +pr_warning ("Could not create debugfs " +"'trace_bprintk_formats' entry\n" ); +#endif +#ifdef CONFIG_DYNAMIC_FTRACE entry = debugfs_create_file("dyn_ftrace_total_info", 0444, d_tracer, &ftrace_update_tot_cnt,
kernel/trace/trace.h +1 -0
@@ -128,6 +128,7 @@ struct bprintk_entry {u32 buf[]; };#ifdef CONFIG_TRACE_BPRINTK +extern struct file_operations trace_bprintk_fmt_fops;extern int trace_bprintk_enable;#endif
kernel/trace/trace_bprintk.c +79 -0
85 lines not on this page · raw message
Quoted 10 lines · Lai Jiangshan
Impact: let user knows the format
Create a file on <debugfs-dir>/tracing/ to show ftrace_bprintk()'s formats.
This formats will help for these condition:
1) User get binary data from core file.(formats are backup before coredump)
2) User splicering_bufferto a file.
User can use formats for parsing the binary data in userspace.
When I 'cat' trace_bprintk_formats on my system the file is empty. This seems to be b/c 'ftrace_bprintk' is not being used in this patchset. It can't be used in patch #5 during marker register b/c the format wouldn't be known at runtime. Thus, as it currently stands this patch, patch 4/5, isn't adding much?
A thought on how this might be resolved would be to have the core marker code pass us its address so this could be recorded in the trace buffer. Then, also add some debug file that displays the markers and maps marker addresses with format strings.
thanks,
-Jason
Quoted 11 lines · Jason Baron
Quoted 9 lines · Lai Jiangshan
Impact: let user knows the format
Create a file on <debugfs-dir>/tracing/ to show ftrace_bprintk()'s formats.
This formats will help for these condition:
1) User get binary data from core file.(formats are backup before coredump)
2) User splicering_bufferto a file.
User can use formats for parsing the binary data in userspace.
Quoted 5 lines
When I 'cat'
trace_bprintk_formatson my system the file is empty. This seems to be b/c 'ftrace_bprintk' is not being used in this patchset. It can't be used in patch #5 during marker register b/c the format wouldn't be known at runtime. Thus, as it currently stands this patch, patch 4/5, isn't adding much?
If you don't use ftrace_bprintk(), the file trace_bprintk_formats is empty. This file record all formats which ftrace_bprintk() uses.
You can use ftrace_bprintk() everywhere as another printk().
Patch #5 enables binary printk for markers, this is another additional tool for tracing markers.
Quoted 6 lines
A thought on how this might be resolved would be to have the core marker code pass us its address so this could be recorded in the trace buffer. Then, also add some debug file that displays the markers and maps marker addresses with format strings.
Patch#5 does it as you said.
Quoted 27 lines · Lai Jiangshan
Quoted 11 lines · Jason Baron
Quoted 9 lines · Lai Jiangshan
Impact: let user knows the format
Create a file on <debugfs-dir>/tracing/ to show ftrace_bprintk()'s formats.
This formats will help for these condition:
1) User get binary data from core file.(formats are backup before coredump)
2) User splicering_bufferto a file.
User can use formats for parsing the binary data in userspace.Quoted 5 lines
When I 'cat'
trace_bprintk_formatson my system the file is empty. This seems to be b/c 'ftrace_bprintk' is not being used in this patchset. It can't be used in patch #5 during marker register b/c the format wouldn't be known at runtime. Thus, as it currently stands this patch, patch 4/5, isn't adding much?If you don't use
ftrace_bprintk(), the filetrace_bprintk_formatsis empty. This file record all formats whichftrace_bprintk()uses.You can use
ftrace_bprintk()everywhere as anotherprintk().Patch #5 enables binary printk for markers, this is another additional tool for tracing markers.
Quoted 1 line
Quoted 10 lines
Quoted 5 lines
A thought on how this might be resolved would be to have the core marker code pass us its address so this could be recorded in the trace buffer. Then, also add some debug file that displays the markers and maps marker addresses with format strings.
Patch#5 does it as you said.
hmm...i'm still not clear on this. in patch #5 you have:
+static void marker_bprintk_probe(void *probe_private, void *call_private,
+ const char *fmt, va_list *args)
+{
+ struct marker_bprintk_struct *p = probe_private;
+
+ if (p->fmt_state == MARKER_FMT_LACK) {
+ int flen = strlen(fmt);
+ if (p->fmt - p->name + flen < MARKER_NAME_FMT_LEN) {
+ memcpy(p->fmt, fmt, flen + 1);
+ p->fmt_state = MARKER_FMT_OK;
+ } else
+ p->fmt_state = MARKER_FMT_INVALID;
+ }
+
+ if (p->fmt_state == MARKER_FMT_OK)
+ trace_vbprintk(0, p->name, *args);
+}
+
trace_vbprintk first argument is 'ip'. So I don't see how we are associating instruction pointers with each 'ftrace' record? Aren't we just recording each entry with '0' for the 'ip'?
thanks,
-Jason
Quoted 57 lines · Jason Baron
Quoted 24 lines · Lai Jiangshan
Quoted 10 lines · Jason Baron
Quoted 9 lines · Lai Jiangshan
Impact: let user knows the format
Create a file on <debugfs-dir>/tracing/ to show ftrace_bprintk()'s formats.
This formats will help for these condition:
1) User get binary data from core file.(formats are backup before coredump)
2) User splicering_bufferto a file.
User can use formats for parsing the binary data in userspace.Quoted 5 lines
When I 'cat'
trace_bprintk_formatson my system the file is empty. This seems to be b/c 'ftrace_bprintk' is not being used in this patchset. It can't be used in patch #5 during marker register b/c the format wouldn't be known at runtime. Thus, as it currently stands this patch, patch 4/5, isn't adding much?If you don't use
ftrace_bprintk(), the filetrace_bprintk_formatsis empty. This file record all formats whichftrace_bprintk()uses.You can use
ftrace_bprintk()everywhere as anotherprintk().Patch #5 enables binary printk for markers, this is another additional tool for tracing markers.
Quoted 9 lines
Quoted 5 lines
A thought on how this might be resolved would be to have the core marker code pass us its address so this could be recorded in the trace buffer. Then, also add some debug file that displays the markers and maps marker addresses with format strings.
Patch#5 does it as you said.
hmm...i'm still not clear on this. in patch #5 you have:
(quoted diff) +18
-0+static void marker_bprintk_probe(void *probe_private, void *call_private, + const char *fmt, va_list *args) +{ + struct marker_bprintk_struct *p = probe_private; + + if (p->fmt_state == MARKER_FMT_LACK) { + int flen = strlen(fmt); + if (p->fmt - p->name + flen < MARKER_NAME_FMT_LEN) { + memcpy(p->fmt, fmt, flen + 1); + p->fmt_state = MARKER_FMT_OK; + } else + p->fmt_state = MARKER_FMT_INVALID; + } + + if (p->fmt_state == MARKER_FMT_OK) + trace_vbprintk(0, p->name, *args); +} +
Quoted 4 lines
trace_vbprintkfirst argument is 'ip'. So I don't see how we are associating instruction pointers with each 'ftrace' record? Aren't we just recording each entry with '0' for the 'ip'?
argument 'ip' is used for ftrace_bprintk(), the caller of ftrace_bprintk() will be output in the message.
argument 'ip' is not used when trace markers.
we may can use:trace_vbprintk(CALLER_ADDR2, p->name, *args);
but this cannot work for !CONFIG_FRAME_POINTER.
I will remove argument 'ip' in next version.(if users need know the call_addr when he use ftrace_bprintk(), just use "%pS":ftrace_bprintk("%pS: msgfmt example %d, %d", _THIS_IP_, msgarg1, msgarg2);)
Thanks for pointed it out.
Lai.