On Sat, Feb 14, 2026 at 8:43 PM Lianbo Jiang <lijiang(a)redhat.com> wrote:
On 1/28/26 9:42 AM, devel-request(a)lists.crash-utility.osci.io wrote:
> Date: Mon, 15 Dec 2025 17:15:15 +0800
> From: neilfsun<loyou85(a)gmail.com>
> Subject: [Crash-utility] [PATCH] Fix dis -lr xxx+0x1 not showing
> target address instruction
> To:devel@lists.crash-utility.osci.io
> Cc: neilfsun<neilfsun(a)tencent.com>, Feng Sun<loyou85(a)gmail.com>
> Message-ID:<20251215091515.36428-1-neilfsun@tencent.com>
>
> When using "dis -lr xxx+0x1", it is not correctly shown, for example:
> crash> dis -lr rb_next+0x1
> /kernel/lib/rbtree.c: 445
> 0xffffffff8133ff60 <rb_next>: push %rbp
>
> However, dis -lr rb+next+0x4 is correctly shown,
> crash> dis -lr rb_next+0x4
> /kernel/lib/rbtree.c: 445
> 0xffffffff8133ff60 <rb_next>: push %rbp
> /kernel/lib/rbtree.c: 448
> 0xffffffff8133ff61 <rb_next+0x1>: mov (%rdi),%rdx
> /kernel/lib/rbtree.c: 445
> 0xffffffff8133ff64 <rb_next+0x4>: mov %rsp,%rbp
>
> The reverse mode only disassembled (target - function_start) bytes, which
> was insufficient to reach the target instruction.
>
> Signed-off-by: neilfsun<neilfsun(a)tencent.com>
> Signed-off-by: Feng Sun<loyou85(a)gmail.com>
> ---
> kernel.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/kernel.c b/kernel.c
> index bb148d0..93ea7a6 100644
> --- a/kernel.c
> +++ b/kernel.c
> @@ -2120,7 +2120,7 @@ cmd_dis(void)
>
> if (reverse)
> sprintf(buf5, "x/%ldi 0x%lx",
> - (target - req->addr) ? target - req->addr : 1,
> + req->addr2 - req->addr,
This will always ask gdb to disassemble a lot of asm instructions, can
Indeed. We will disassemble all instructions of the function, but only
take the first few instructions for output, that would be a waste.
you help try this one?
diff --git a/kernel.c b/kernel.c
index ccc4b3d..550f61a 100644
--- a/kernel.c
+++ b/kernel.c
@@ -2124,8 +2124,7 @@ cmd_dis(void)
open_tmpfile();
if (reverse)
- sprintf(buf5, "x/%ldi 0x%lx",
- (target - req->addr) ? target -
req->addr : 1,
+ sprintf(buf5, "x/%ldi 0x%lx", roundup(abs(target
- req->addr), 2),
This one also have some problems:
crash> dis -r rb_next+0 <<----should output 1 instruction to include
"rb_next+0"
crash> dis -r rb_next+1 <<---- OK
0xffffffff81329600 <rb_next>: push %rbp
0xffffffff81329601 <rb_next+1>: mov (%rdi),%rdx
crash> dis -r rb_next+2 <<---- should output 3 instruction, because
"rb_next+2" is not included by any outputted instructions.
0xffffffff81329600 <rb_next>: push %rbp
0xffffffff81329601 <rb_next+1>: mov (%rdi),%rdx
crash> dis -r rb_next+3 <<---- OK
0xffffffff81329600 <rb_next>: push %rbp
0xffffffff81329601 <rb_next+1>: mov (%rdi),%rdx
0xffffffff81329604 <rb_next+4>: mov %rsp,%rbp
crash> dis -r rb_next+4 <<---- OK
0xffffffff81329600 <rb_next>: push %rbp
0xffffffff81329601 <rb_next+1>: mov (%rdi),%rdx
0xffffffff81329604 <rb_next+4>: mov %rsp,%rbp
crash> dis -r rb_next+5 <<---- OK
0xffffffff81329600 <rb_next>: push %rbp
0xffffffff81329601 <rb_next+1>: mov (%rdi),%rdx
0xffffffff81329604 <rb_next+4>: mov %rsp,%rbp
0xffffffff81329607 <rb_next+7>: cmp %rdx,%rdi
In addition, the 2 in roundup() is a magic number to me.
How about the following modification:
if (reverse)
sprintf(buf5, "x/%ldi 0x%lx",
- (target - req->addr) ? target - req->addr : 1,
+ abs(target - req->addr) + 1,
req->addr);
crash> dis -r rb_next+0
0xffffffff81329600 <rb_next>: push %rbp
crash> dis -r rb_next+1
0xffffffff81329600 <rb_next>: push %rbp
0xffffffff81329601 <rb_next+1>: mov (%rdi),%rdx
crash> dis -r rb_next+2
0xffffffff81329600 <rb_next>: push %rbp
0xffffffff81329601 <rb_next+1>: mov (%rdi),%rdx
0xffffffff81329604 <rb_next+4>: mov %rsp,%rbp
crash> dis -r rb_next+3
0xffffffff81329600 <rb_next>: push %rbp
0xffffffff81329601 <rb_next+1>: mov (%rdi),%rdx
0xffffffff81329604 <rb_next+4>: mov %rsp,%rbp
crash> dis -r rb_next+4
0xffffffff81329600 <rb_next>: push %rbp
0xffffffff81329601 <rb_next+1>: mov (%rdi),%rdx
0xffffffff81329604 <rb_next+4>: mov %rsp,%rbp
crash> dis -r rb_next+5
0xffffffff81329600 <rb_next>: push %rbp
0xffffffff81329601 <rb_next+1>: mov (%rdi),%rdx
0xffffffff81329604 <rb_next+4>: mov %rsp,%rbp
0xffffffff81329607 <rb_next+7>: cmp %rdx,%rdi
Thanks,
Tao Liu
req->addr);
else
sprintf(buf5, "x/%ldi 0x%lx",
Thanks
Lianbo
> req->addr);
> else
> sprintf(buf5, "x/%ldi 0x%lx",
> -- 2.50.1
--
Crash-utility mailing list -- devel(a)lists.crash-utility.osci.io
To unsubscribe send an email to devel-leave(a)lists.crash-utility.osci.io
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines:
https://github.com/crash-utility/crash/wiki