On 2025/09/17 16:20, lijiang wrote:
On Wed, Sep 17, 2025 at 2:17 PM HAGIO KAZUHITO(萩尾 一仁)
<k-hagio-ab(a)nec.com <mailto:k-hagio-ab@nec.com>> wrote:
Hi Lianbo,
Thank you for fixing it quickly.
btw, seeing 99bb57ac98af, I had a couple of questions, is there a
way to
print the original (not mangled) log buffer?
Good questions, Kazu.
Add an option(E.g -R) to the log command that can help solve it. For
example:
The log will print original messages.
crash> log
The log -R will print demangled Rust symbol names if there are any
mangled Rust symbol names.
crash> log -R
also, if the log buffer has lines like "_R ... +" which are not rust
symbols unexpectedly, how are they printed?
For this case, the rust_demangle() will fail, and still print the
original messages.
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);
How about the above solutions? Kazu.
Thank you for considering, these look good to me.
also, if text_len is limited to BUFSIZE for this function, maybe it
should be only when "log -R" ?
BWT: Originally I tried the following code, but it looks ugly. So
simplify this one.
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);
if (CRASHDEBUG(1))
fprintf(fp, "%s", buf);
else
fprintf(fp, "%s",demangled);
free(res);
} else
fprintf(fp, "%s", buf);
} else
fprintf(fp, "%s", buf);
I did not realize that the original messages(mangled Rust symbols names)
are still helpful to you.
It's just confusing that we see different logs in crash "log" and
vmcore-dmesg.txt etc, and like this time, if there is a bug in the
demangling process, then we would like to check the original messages.
Thanks,
Kazu
>
> Thanks
> Lianbo
>
> (nice function, but maybe such function should be an option imho..)
>
> Thanks,
> Kazu
>
> On 2025/09/17 7:55, Tao Liu wrote:
> > applied:
>
https://github.com/crash-utility/crash/commit/0df76345db8f7bb2ce70138eee6...
<
https://github.com/crash-utility/crash/commit/0df76345db8f7bb2ce70138eee6...
> >
> > On Wed, Sep 17, 2025 at 10:34 AM Tao Liu <ltao(a)redhat.com
> <mailto:ltao@redhat.com>> wrote:
> >>
> >> Hi Lianbo,
> >>
> >> Thanks for the fix, LGTM, ack.
> >>
> >> Thanks,
> >> Tao Liu
> >>
> >> On Tue, Sep 16, 2025 at 8:05 PM Lianbo Jiang <lijiang(a)redhat.com
> <mailto:lijiang@redhat.com>> wrote:
> >>>
> >>> The log command printed a couple of empty lines (only
> timestamps), which
> >>> was caused by the commit 99bb57ac98af ("Enable resolving
> mangled Rust
> >>> symbol in lockless ring buffer"), E.g:
> >>>
> >>> $ diff -u log.pre log.cur
> >>> --- log.pre 2025-09-16 13:14:31.022206514 +0900
> >>> +++ log.cur 2025-09-16 13:14:56.220390987 +0900
> >>> @@ -210,7 +210,7 @@
> >>> [ 0.169375] clocksource: jiffies: mask: 0xffffffff
> max_cycles: 0xffffffff, max_idle_ns: 1911260446275000 ns
> >>> [ 0.169375] futex hash table entries: 1024 (order: 4,
> 65536 bytes, linear)
> >>> [ 0.169375] pinctrl core: initialized pinctrl subsystem
> >>> -[ 0.172925] NET: Registered PF_NETLINK/PF_ROUTE
> protocol family
> >>> +[ 0.172925]
> >>> [ 0.172983] DMA: preallocated 512 KiB GFP_KERNEL pool
> for atomic allocations
> >>> [ 0.172986] DMA: preallocated 512 KiB
> GFP_KERNEL|GFP_DMA pool for atomic allocations
> >>> [ 0.172988] DMA: preallocated 512 KiB
> GFP_KERNEL|GFP_DMA32 pool for atomic allocations
> >>> @@ -807,7 +807,7 @@
> >>> [771438.513231] entry_SYSCALL_64_after_hwframe+0x72/0xdc
> >>> [771438.513423] RIP: 0033:0x7fbd9f8fda57
> >>> [771438.513576] Code: 0f 00 f7 d8 64 89 02 48 c7 c0 ff ff
> ff ff eb b7 0f 1f 00 f3 0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 10
> b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 51 c3 48 83 ec 28 48 89
> 54 24 18 48 89 74 24
> >>> -[771438.514251] RSP: 002b:00007ffee0de2b98 EFLAGS:
> 00000246 ORIG_RAX: 0000000000000001
> >>> +[771438.514251]
> >>> [771438.514534] RAX: ffffffffffffffda RBX:
> 0000000000000002 RCX: 00007fbd9f8fda57
> >>> [771438.514800] RDX: 0000000000000002 RSI:
> 00005647ccc0a330 RDI: 0000000000000001
> >>> [771438.515066] RBP: 00005647ccc0a330 R08:
> 0000000000000003 R09: 0000000000000000
> >>>
> >>> This is because the strchrnul() returns a pointer to the null
byte
> >>> instead NULL if the char to be searched is not in the string.
Given
> >>> that, let's replace the strchrnul() with the strrchr().
> >>>
> >>> Fixes: 99bb57ac98af ("Enable resolving mangled Rust symbol
in
> lockless ring buffer")
> >>> Reported-by: Kazuhito Hagio <k-hagio-ab(a)nec.com
> <mailto:k-hagio-ab@nec.com>>
> >>> Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com
> <mailto:lijiang@redhat.com>>
> >>> ---
> >>> printk.c | 2 +-
> >>> 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>
> >>> diff --git a/printk.c b/printk.c
> >>> index ae28c4fa0b21..51b618e2a434 100644
> >>> --- a/printk.c
> >>> +++ b/printk.c
> >>> @@ -221,7 +221,7 @@ dump_record(struct prb_map *m, unsigned
> long id, int msg_flags)
> >>> char *p1 = strstr(buf, "_R");
> >>> if (!p1)
> >>> p1 = strstr(buf, "_ZN");
> >>> - char *p2 = strchrnul(buf, '+');
> >>> + char *p2 = strrchr(buf, '+');
> >>> if (p1 && p2) {
> >>> char mangled[BUFSIZE] = {0};
> >>> char demangled[BUFSIZE] = {0};
> >>> --
> >>> 2.50.1
> >>>
>