On Wed, Aug 27, 2025 at 4:09 PM Lianbo Jiang <[email protected]> wrote:
>
> Without the patch:
> crash> bt
> PID: 3520 TASK: ffff8f240f670000 CPU: 1 COMMAND: "insmod"
> #0 [ffffd08c4f063a20] machine_kexec at ffffffff9575e60e
> #1 [ffffd08c4f063a40] __crash_kexec at ffffffff958db711
> #2 [ffffd08c4f063b00] panic at ffffffff9560cede
> #3 [ffffd08c4f063b80] _RNvCscb18lrEyTSA_10rust_panic10area_in_hp at
> ffffffffc07fe107 [rust_panic]
> #4 [ffffd08c4f063c20]
> _RNvMCscb18lrEyTSA_10rust_panicNtB2_10HelloPanic8step_two at ffffffffc07fe160
> [rust_panic]
> ...
>
> crash> sym _RNvCscb18lrEyTSA_10rust_panic10area_in_hp
> ffffffffc07fe010 (t) _RNvCscb18lrEyTSA_10rust_panic10area_in_hp
> [rust_panic] /root/linux-6.16.3/samples/rust/rust_panic.rs: 22
>
> With the patch:
> crash> bt
> PID: 3520 TASK: ffff8f240f670000 CPU: 1 COMMAND: "insmod"
> #0 [ffffd08c4f063a20] machine_kexec at ffffffff9575e60e
> #1 [ffffd08c4f063a40] __crash_kexec at ffffffff958db711
> #2 [ffffd08c4f063b00] panic at ffffffff9560cede
> #3 [ffffd08c4f063b80] rust_panic::area_in_hp at ffffffffc07fe107
> [rust_panic]
> #4 [ffffd08c4f063c20] <rust_panic::HelloPanic>::step_two at
> ffffffffc07fe160 [rust_panic]
> ...
>
> crash> sym "rust_panic::area_in_hp"
> ffffffffc07fe010 (t) rust_panic::area_in_hp [rust_panic]
> /root/linux-6.16.3/samples/rust/rust_panic.rs: 22
>
> Signed-off-by: Lianbo Jiang <[email protected]>
> ---
> symbols.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 45 insertions(+)
>
> diff --git a/symbols.c b/symbols.c
> index 052196265be0..7e9f57be7cec 100644
> --- a/symbols.c
> +++ b/symbols.c
> @@ -3277,6 +3277,46 @@ load_module_filter(char *s, int type)
>
> #define AVERAGE_SYMBOL_SIZE (16)
>
> +static size_t rust_demangle_symbol(const char *symbol, char *out, size_t
> out_size)
> +{
> + int i;
> + size_t loc = 0;
> + size_t len = strlen(symbol);
> + char *buf = NULL;
> + /*
> + * Rust symbols always start with _R (v0) or _ZN (legacy)
> + */
> + const char *mangled_rust[] = {
> + "_R",
> + "_ZN",
> + NULL
> + };
> +
> + if (!out || out_size < len)
> + return 0;
> +
> + for (i = 0; mangled_rust[i]; i++) {
> + size_t sz = strlen(mangled_rust[i]);
> + char *p = memmem(symbol, len, mangled_rust[i], sz);
> + if (p) {
> + loc = p - symbol;
> + if (loc)
> + memcpy(out, symbol, loc);
> + break;
> + }
> + }
> +
> + buf = rust_demangle(symbol + loc, DMGL_RUST);
> + if (buf) {
> + memcpy(out + loc, buf, strlen(buf));
I guess this one is fine, "out" is a 1500 size buf, and it only deals
with symbol names, so after demangle it hardly exceeds 1.5k size, so
we can leave it for now.
So for this one, ack.
> + free(buf);
> + return 1;
> + } else if (loc != 0)
> + memset(out, 0, loc);
> +
> + return 0;
> +}
> +
> static int
> namespace_ctl(int cmd, struct symbol_namespace *ns, void *nsarg1, void
> *nsarg2)
> {
> @@ -3315,9 +3355,14 @@ namespace_ctl(int cmd, struct symbol_namespace *ns,
> void *nsarg1, void *nsarg2)
> return TRUE;
>
> case NAMESPACE_INSTALL:
> + char demangled[BUFSIZE] = {0};
> sp = (struct syment *)nsarg1;
> name = (char *)nsarg2;
> len = strlen(name)+1;
> + if (rust_demangle_symbol(name, demangled, sizeof(demangled)))
> {
> + len = strlen(demangled) + 1;
> + name = demangled;
> + }
> if ((ns->index + len) >= ns->size) {
> if (!(addr = realloc(ns->address, ns->size*2)))
> error(FATAL, "symbol name space malloc: %s\n",
> --
> 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
--
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