Hi lianbo,

Thanks for the v2, LGTM, ack.


On Mon, Sep 8, 2025 at 8:42 PM Lianbo Jiang <[email protected]> wrote:
>
> 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 <[email protected]>
> ---
> Note:
> 1. Add some checks to avoid the risk of buffer overflow.
>
>  Makefile |  2 +-
>  printk.c | 33 ++++++++++++++++++++++++++++++++-
>  2 files changed, 33 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..ae28c4fa0b21 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 {
> @@ -201,14 +202,44 @@ dump_record(struct prb_map *m, unsigned long id, int 
> msg_flags)
>
>         text = m->text_data + begin;
>
> +       if (text_len > BUFSIZE) {
> +               error(WARNING, "\nThe messages could be truncated!\n");
> +               text_len = BUFSIZE;
> +       }
> +
>         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))
> -                       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) {
> +                       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_DICT) {
>                 text = info + OFFSET(printk_info_dev_info) +
> --
> 2.50.1
>
--
Crash-utility mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to