Hi Lianbo,

It seems we have a problem printing disassembly blocks in the log after this 
patch (at least on s390).
See number of empty lines printed below.

Before the patch:
  [   21.408784] Krnl GPRS: 000002aa3780c000 0000000000238c00 0000000015800000 
0000000000001000
  [   21.408787]            0000000008e30000 00000000b0001000 0000000000000000 
0000000000000a55
  [   21.408790]            0000000004c52300 000002aa3780c000 00000000084281d0 
0000038000bfbd28
  [   21.408794]            00000000075e9500 0000000004c52300 0000038000bfbbf0 
0000038000bfbb90
  [   21.408860] Krnl Code: 000000000e0acf48: c05fb0001000        llilf   
%r5,2952794112
                            000000000e0acf4e: ec4100b30659        risbgn  
%r4,%r1,0,179,6
                           #000000000e0acf54: 0e24                mvcl    
%r2,%r4
                           >000000000e0acf56: a7280000            lhi     %r2,0
                            000000000e0acf5a: eb6ff0a80004        lmg     
%r6,%r15,168(%r15)
                            000000000e0acf60: b9140022            lgfr    
%r2,%r2
                            000000000e0acf64: 07fe                bcr     
15,%r14
                            000000000e0acf66: 47000700            bc      0,1792
  [   21.408883] Call Trace:

After the patch:
  [   21.408784] Krnl GPRS: 000002aa3780c000 0000000000238c00 0000000015800000 
0000000000001000
  [   21.408787]            0000000008e30000 00000000b0001000 0000000000000000 
0000000000000a55
  [   21.408790]            0000000004c52300 000002aa3780c000 00000000084281d0 
0000038000bfbd28
  [   21.408794]            00000000075e9500 0000000004c52300 0000038000bfbbf0 
0000038000bfbb90
  [   21.408860] 
               
               
               
               
               
               
                 Krnl Code: 000000000e0acf48: c05fb0001000        llilf   
%r5,2952794112
  [   21.408883] Call Trace:

I think your approach of storing printable characters in the buffer with the 
intention to modify it
afterwards (see [1] below) instead of writing it character wise does not work 
when the input data
contains several lines. Those '\n' are written one by one, what leads to the 
result shown above. 
You should probably buffer and 'demangle' each line separately.

On 9/8/2025 10:42 AM, Lianbo Jiang 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]>
> ---

> 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);

[1]

>               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) +

Thanks,
Mikhail
--
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