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 | 53 +++++++++++++++++++++++++++++------------------------ 4 files changed, 57 insertions(+), 26 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..b8fcc8e58160 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; } @@ -210,36 +210,41 @@ dump_record(struct prb_map *m, unsigned long id, int msg_flags) for (i = 0, p = text; i < text_len; i++, p++) { if (*p == '\n') fprintf(fp, "\n%s", space(ilen)); - else if (isprint(*p) || isspace(*p)) + else if ((msg_flags & SHOW_LOG_RUST) && (isprint(*p) || isspace(*p))) sprintf(&buf[i], "%c", *p); + else if (isprint(*p) || isspace(*p)) + fputc(*p, fp); else fputc('.', fp); } /* * 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); - } - } else - fprintf(fp, "%s", buf); + 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); + } if (msg_flags & SHOW_LOG_DICT) { text = info + OFFSET(printk_info_dev_info) + -- 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