Without the patch: crash> log ... [ 2174.308966] Call Trace: [ 2174.311693] <TASK> [ 2174.314033] dump_stack_lvl+0x5d/0x80 [ 2174.318125] panic+0x156/0x32a [ 2174.321539] _RNvCscb18lrEyTSA_10rust_panic10area_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] _RNvMCscb18lrEyTSA_10rust_panicNtB2_10HelloPanic8step_two+0x20/0xe0 [rust_panic] [ 2174.353698] ? _printk+0x6b/0x90 ...
With the patch: crash> log ... [ 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 ... Signed-off-by: Lianbo Jiang <liji...@redhat.com> --- Makefile | 2 +- printk.c | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index fc1c9588dcfa..b277129f6df2 100644 --- a/Makefile +++ b/Makefile @@ -421,7 +421,7 @@ kernel.o: ${GENERIC_HFILES} kernel.c ${CC} -c ${CRASH_CFLAGS} kernel.c -I${BFD_DIRECTORY} -I${GDB_INCLUDE_DIRECTORY} ${WARNING_OPTIONS} ${WARNING_ERROR} printk.o: ${GENERIC_HFILES} printk.c - ${CC} -c ${CRASH_CFLAGS} printk.c ${WARNING_OPTIONS} ${WARNING_ERROR} + ${CC} -c ${CRASH_CFLAGS} printk.c -I${GDB_INCLUDE_DIRECTORY} ${WARNING_OPTIONS} ${WARNING_ERROR} gdb_interface.o: ${GENERIC_HFILES} gdb_interface.c ${CC} -c ${CRASH_CFLAGS} gdb_interface.c ${WARNING_OPTIONS} ${WARNING_ERROR} diff --git a/printk.c b/printk.c index 95db7e607e4c..6a87a790b892 100644 --- a/printk.c +++ b/printk.c @@ -1,5 +1,6 @@ #include "defs.h" #include <ctype.h> +#include "demangle.h" /* convenience struct for passing many values to helper functions */ struct prb_map { @@ -205,10 +206,35 @@ dump_record(struct prb_map *m, unsigned long id, int msg_flags) if (*p == '\n') fprintf(fp, "\n%s", space(ilen)); else if (isprint(*p) || isspace(*p)) - fputc(*p, fp); + sprintf(&buf[i], "%c", *p); 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 = strchrnul(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) { + sprintf(demangled+slen, "%s%s", res,p2); + fprintf(fp, "%s",demangled); + free(res); + } + } 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