Please ignore this patch, I will post v2 later with a slight change. Sorry about that.
Thanks Lianbo On Wed, Sep 17, 2025 at 6:00 PM Lianbo Jiang <liji...@redhat.com> wrote: > Currently, the log command will display human readable Rust > symbol name by default if any, but, sometimes still want to > print the original messages from the log buffer(do not demangle). > > In addition, if the log buffer has lines like "_R ... +" which > are not Rust symbols unexpectedly, probably the output will be > missed, that is unexpected. > > To fix above cases, add "log -R" to display human readable Rust > symbol name, otherwise still print the original messages. > > With the patch: > crash> log -R > ... > [ 2174.289360] Tainted: [S]=CPU_OUT_OF_SPEC, [O]=OOT_MODULE, > [E]=UNSIGNED_MODULE > [ 2174.297322] Hardware name: Intel Corporation S2600CWR/S2600CWR, BIOS > SE5C610.86B.01.01.0018.072020161249 07/20/2016 > [ 2174.308966] Call Trace: > [ 2174.311693] <TASK> > [ 2174.314033] dump_stack_lvl+0x5d/0x80 > [ 2174.318125] panic+0x156/0x32a > [ 2174.321539] rust_panic::area_in_hp+0xf7/0x120 [rust_panic] > [ 2174.329700] ? console_unlock+0x9c/0x140 > [ 2174.334080] ? irq_work_queue+0x2d/0x50 > [ 2174.338352] ? __pfx_init_module+0x10/0x10 [rust_panic] > [ 2174.344183] <rust_panic::HelloPanic>::step_two+0x20/0xe0 [rust_panic] > [ 2174.353698] ? _printk+0x6b/0x90 > [ 2174.357303] init_module+0x57/0xff0 [rust_panic] > [ 2174.362456] ? __pfx_init_module+0x10/0x10 [rust_panic] > ... > > Suggested-by: Kazuhito Hagio <k-hagio...@nec.com> > Signed-off-by: Lianbo Jiang <liji...@redhat.com> > --- > defs.h | 1 + > help.c | 24 +++++++++++++++++++++++- > kernel.c | 5 ++++- > printk.c | 46 +++++++++++++++++++++++++--------------------- > 4 files changed, 53 insertions(+), 23 deletions(-) > > diff --git a/defs.h b/defs.h > index 156ac0232906..997145cba9d2 100644 > --- a/defs.h > +++ b/defs.h > @@ -6227,6 +6227,7 @@ void parse_kernel_version(char *); > #define SHOW_LOG_CTIME (0x10) > #define SHOW_LOG_SAFE (0x20) > #define SHOW_LOG_CALLER (0x40) > +#define SHOW_LOG_RUST (0x80) > void set_cpu(int); > void clear_machdep_cache(void); > struct stack_hook *gather_text_list(struct bt_info *); > diff --git a/help.c b/help.c > index 4f071e0bd0a0..78d7a5c70e30 100644 > --- a/help.c > +++ b/help.c > @@ -4026,7 +4026,7 @@ NULL > char *help_log[] = { > "log", > "dump system message buffer", > -"[-Ttdmasc]", > +"[-TtdmascR]", > " This command dumps the kernel log_buf contents in chronological > order. The", > " command supports the older log_buf formats, which may or may not > contain a", > " timestamp inserted prior to each message, as well as the newer > variable-length", > @@ -4053,6 +4053,8 @@ char *help_log[] = { > " the CPU id (if in CPU context) that called printk(), if > available.", > " Generally available on Linux 5.1 to 5.9 kernels configured with", > " CONFIG_PRINTK_CALLER or Linux 5.10 and later kernels.", > +" -R Display the message text with human readable Rust symbol name if > any,", > +" otherwise still print the original message text.", > " ", > "\nEXAMPLES", > " Dump the kernel message buffer:\n", > @@ -4231,6 +4233,26 @@ char *help_log[] = { > " [ 0.014179] [ T29] RAMDISK: [mem 0x3cf4f000-0x437bbfff]", > " [ 0.198789] [ C0] DMAR: DRHD: handling fault status reg 3", > " ...", > +" ", > +" Display the message text with human readable Rust symbol name if any,", > +" otherwise still print the original message text.\n", > +" %s> log -R", > +" ...", > +" [ 2174.289360] Tainted: [S]=CPU_OUT_OF_SPEC, [O]=OOT_MODULE, > [E]=UNSIGNED_MODULE", > +" [ 2174.297322] Hardware name: Intel Corporation S2600CWR/S2600CWR, > BIOS SE5C610.86B.01.01.0018.072020161249 07/20/2016", > +" [ 2174.308966] Call Trace:", > +" [ 2174.311693] <TASK>", > +" [ 2174.314033] dump_stack_lvl+0x5d/0x80", > +" [ 2174.318125] panic+0x156/0x32a", > +" [ 2174.321539] rust_panic::area_in_hp+0xf7/0x120 [rust_panic]", > +" [ 2174.329700] ? console_unlock+0x9c/0x140", > +" [ 2174.334080] ? irq_work_queue+0x2d/0x50", > +" [ 2174.338352] ? __pfx_init_module+0x10/0x10 [rust_panic]", > +" [ 2174.344183] <rust_panic::HelloPanic>::step_two+0x20/0xe0 > [rust_panic]", > +" [ 2174.353698] ? _printk+0x6b/0x90", > +" [ 2174.357303] init_module+0x57/0xff0 [rust_panic]", > +" [ 2174.362456] ? __pfx_init_module+0x10/0x10 [rust_panic]", > +" ...", > > NULL > }; > diff --git a/kernel.c b/kernel.c > index e4213d7a663e..e077275d7ed6 100644 > --- a/kernel.c > +++ b/kernel.c > @@ -5136,7 +5136,7 @@ cmd_log(void) > > msg_flags = 0; > > - while ((c = getopt(argcnt, args, "Ttdmasc")) != EOF) { > + while ((c = getopt(argcnt, args, "TtdmascR")) != EOF) { > switch(c) > { > case 'T': > @@ -5160,6 +5160,9 @@ cmd_log(void) > case 'c': > msg_flags |= SHOW_LOG_CALLER; > break; > + case 'R': > + msg_flags |= SHOW_LOG_RUST; > + break; > default: > argerrs++; > break; > diff --git a/printk.c b/printk.c > index 51b618e2a434..e4cc6dc30065 100644 > --- a/printk.c > +++ b/printk.c > @@ -202,7 +202,7 @@ dump_record(struct prb_map *m, unsigned long id, int > msg_flags) > > text = m->text_data + begin; > > - if (text_len > BUFSIZE) { > + if ((msg_flags & SHOW_LOG_RUST) && (text_len > BUFSIZE)) { > error(WARNING, "\nThe messages could be truncated!\n"); > text_len = BUFSIZE; > } > @@ -218,26 +218,30 @@ dump_record(struct prb_map *m, unsigned long id, int > msg_flags) > /* > * Try to demangle a mangled Rust symbol(calltrace) from log buffer > */ > - char *p1 = strstr(buf, "_R"); > - if (!p1) > - p1 = strstr(buf, "_ZN"); > - char *p2 = strrchr(buf, '+'); > - if (p1 && p2) { > - char mangled[BUFSIZE] = {0}; > - char demangled[BUFSIZE] = {0}; > - char *res; > - size_t slen = p1 - buf; > - > - if (slen) > - memcpy(demangled, buf, slen); > - > - memcpy(mangled, p1, p2-p1); > - res = rust_demangle(mangled, DMGL_RUST); > - if (res) { > - snprintf(demangled+slen, BUFSIZE-slen, "%s%s", > res, p2); > - fprintf(fp, "%s",demangled); > - free(res); > - } > + if (msg_flags & SHOW_LOG_RUST) { > + char *p1 = strstr(buf, "_R"); > + if (!p1) > + p1 = strstr(buf, "_ZN"); > + char *p2 = strrchr(buf, '+'); > + if (p1 && p2) { > + char mangled[BUFSIZE] = {0}; > + char demangled[BUFSIZE] = {0}; > + char *res; > + size_t slen = p1 - buf; > + > + if (slen) > + memcpy(demangled, buf, slen); > + > + memcpy(mangled, p1, p2-p1); > + res = rust_demangle(mangled, DMGL_RUST); > + if (res) { > + snprintf(demangled+slen, BUFSIZE-slen, > "%s%s", res, p2); > + fprintf(fp, "%s",demangled); > + free(res); > + } else > + fprintf(fp, "%s", buf); > + } else > + fprintf(fp, "%s", buf); > } else > fprintf(fp, "%s", buf); > > -- > 2.50.1 > >
-- Crash-utility mailing list -- devel@lists.crash-utility.osci.io To unsubscribe send an email to devel-le...@lists.crash-utility.osci.io https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/ Contribution Guidelines: https://github.com/crash-utility/crash/wiki