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

Reply via email to