gdb 在清零缓冲区时显示错误的地址
gdb shows wrong addresses while zeroing a buffer
我的objective是在汇编中初始化一个buffer。我在 64 位 linux 和 gdb 上使用 NASM 进行调试。相关的汇编程序如下(我从gdb的TUI模式复制粘贴,所以你可以看到行号):
│ 4 section .data
│ 5
│ 6 length dd 4096
│ 7 format db "%20ld",10,0
│ 8
│ 9 section .bss
│ 10
│ 11 buffer resd 4096
│ 83 init_buffer:
│ 84 ;we will use r8 for our counter
│ 85 ;and r9 for the buffer base address
│ 86 xor r8,r8
│ 87 lea r9, [buffer]
│ 88 mov r10d, DWORD 0xDADADA; not 0 to make debugging easier
│ 89 mov eax, [length]
│ 90 movsxd rax, eax
│ 91 .init_buffer_loop:
│ 92 mov [r9 + r8*4], r10d
│ 93 inc r8
│ 94 cmp r8, rax
│ 95 jb .init_buffer_loop
│ 96 ret
我使用以下命令来构建程序(我在另一个时刻使用 printf):
nasm -F dwarf -f elf64 myProgram.asm && gcc -g myProgram.o
调试另一个问题时(我用的是gdb -tui a.out
),发现r9的值和buffer
的地址不一样:
(gdb) b 87
Breakpoint 1 at 0x4011a8: file myProgram.asm, line 87.
(gdb) r
Starting program: /path/to/my/program
Breakpoint 1, init_buffer () at myProgram.asm:87
(gdb) p &buffer
= (char **) 0x7ffff7fa0250 <buffer>
(gdb) n
(gdb) i r r9
r9 0x405034 4214836
(gdb) n
init_buffer.init_buffer_loop () at myProgram.asm:92
;//some next instructions are missing here, we are at line 94 now:
(gdb) x /1xd 4214836
0x405034 <buffer>: 14342874
(gdb) x /4x 4214836
0x405034 <buffer>: 0x00dadada 0x00000000 0x00000000 0x00000000
(gdb) p (int[4])buffer
= {0, 0, 0, 0}
汇编代码有错误吗?还是我调试错了?我问了一些程序员,他们无法向我解释,但他们对 gdb-ing 汇编没有太多经验...
如注释所示,glibc 的另一个源文件中还有另一个名为buffer
的变量。将变量名称更改为 puffer
会得到预期的结果。
此外,以下行应该让我怀疑:
= (char **) 0x7ffff7fa0250 <buffer>
gdb 没有干扰我的汇编代码中的类型,但它知道我将 char **
s 放入缓冲区。
我的objective是在汇编中初始化一个buffer。我在 64 位 linux 和 gdb 上使用 NASM 进行调试。相关的汇编程序如下(我从gdb的TUI模式复制粘贴,所以你可以看到行号):
│ 4 section .data
│ 5
│ 6 length dd 4096
│ 7 format db "%20ld",10,0
│ 8
│ 9 section .bss
│ 10
│ 11 buffer resd 4096
│ 83 init_buffer:
│ 84 ;we will use r8 for our counter
│ 85 ;and r9 for the buffer base address
│ 86 xor r8,r8
│ 87 lea r9, [buffer]
│ 88 mov r10d, DWORD 0xDADADA; not 0 to make debugging easier
│ 89 mov eax, [length]
│ 90 movsxd rax, eax
│ 91 .init_buffer_loop:
│ 92 mov [r9 + r8*4], r10d
│ 93 inc r8
│ 94 cmp r8, rax
│ 95 jb .init_buffer_loop
│ 96 ret
我使用以下命令来构建程序(我在另一个时刻使用 printf):
nasm -F dwarf -f elf64 myProgram.asm && gcc -g myProgram.o
调试另一个问题时(我用的是gdb -tui a.out
),发现r9的值和buffer
的地址不一样:
(gdb) b 87
Breakpoint 1 at 0x4011a8: file myProgram.asm, line 87.
(gdb) r
Starting program: /path/to/my/program
Breakpoint 1, init_buffer () at myProgram.asm:87
(gdb) p &buffer
= (char **) 0x7ffff7fa0250 <buffer>
(gdb) n
(gdb) i r r9
r9 0x405034 4214836
(gdb) n
init_buffer.init_buffer_loop () at myProgram.asm:92
;//some next instructions are missing here, we are at line 94 now:
(gdb) x /1xd 4214836
0x405034 <buffer>: 14342874
(gdb) x /4x 4214836
0x405034 <buffer>: 0x00dadada 0x00000000 0x00000000 0x00000000
(gdb) p (int[4])buffer
= {0, 0, 0, 0}
汇编代码有错误吗?还是我调试错了?我问了一些程序员,他们无法向我解释,但他们对 gdb-ing 汇编没有太多经验...
如注释所示,glibc 的另一个源文件中还有另一个名为buffer
的变量。将变量名称更改为 puffer
会得到预期的结果。
此外,以下行应该让我怀疑:
= (char **) 0x7ffff7fa0250 <buffer>
gdb 没有干扰我的汇编代码中的类型,但它知道我将 char **
s 放入缓冲区。