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.
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.
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/0df76345db8f7bb2ce70138eee65b71e157b280a
>
> On Wed, Sep 17, 2025 at 10:34 AM Tao Liu <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@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@nec.com>
>>> Signed-off-by: Lianbo Jiang <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
>>>