Assembly 将缓冲区归零时,gdb显示错误的地址

Assembly 将缓冲区归零时,gdb显示错误的地址,assembly,x86,gdb,x86-64,nasm,Assembly,X86,Gdb,X86 64,Nasm,我的目标是在程序集中初始化缓冲区。我在64位linux和gdb上使用NASM进行调试。相关的汇编程序如下(我从gdb的TUI模式复制粘贴,因此您可以看到行号): 我使用以下命令来构建程序(我在另一个时刻使用printf): 在调试另一个问题时(我使用了gdb-tui a.out),我意识到r9中的值和缓冲区的地址是不同的: (gdb) b 87 Breakpoint 1 at 0x4011a8: file myProgram.asm, line 87. (gdb) r Starting p

我的目标是在程序集中初始化缓冲区。我在64位linux和gdb上使用NASM进行调试。相关的汇编程序如下(我从gdb的TUI模式复制粘贴,因此您可以看到行号):

我使用以下命令来构建程序(我在另一个时刻使用printf):

在调试另一个问题时(我使用了
gdb-tui a.out
),我意识到r9中的值和
缓冲区的地址是不同的:

(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
$1 = (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
$3 = {0, 0, 0, 0}
(gdb)b87
断点1位于0x4011a8:文件myProgram.asm,第87行。
(gdb)r
启动程序:/path/to/my/program
断点1,myProgram.asm处的init_缓冲区():87
(gdb)p&buffer
$1=(字符**)0x7ffff7fa0250
(gdb)n
(gdb)i r r9
r9 0x405034 4214836
(gdb)n
init_buffer.init_buffer_循环()位于myProgram.asm:92
;//下面缺少一些说明,我们现在在第94行:
(gdb)x/1xd 4214836
0x405034:14342874
(gdb)x/4x 4214836
0x405034:0x00dadada 0x00000000 0x00000000 0x00000000
(gdb)p(int[4])缓冲区
$3 = {0, 0, 0, 0}

汇编代码中有错误吗?还是我调试错了?我问了一些程序员,他们无法向我解释,但他们没有多少gdb ing assembly方面的经验…

如评论所示,在glibc的另一个源文件中有另一个名为
buffer
的变量。将变量名更改为
puffer
将得到预期的结果。 此外,下面这句话应该让我怀疑:

$1 = (char **) 0x7ffff7fa0250 <buffer>
$1=(字符**)0x7ffff7fa0250

gdb并没有干扰我的汇编代码中的类型,但它知道我将
char**
s放入了缓冲区

您可能有多个名为
buffer
cat myProgram.asm | grep^\s+buffer的符号
只给出一个result@Jester:或glibc在某些源文件中有一些内部
静态int缓冲区[]
;像
buf
这样的通用名称与glibc调试符号/global vars冲突是此类问题的常见问题。是的,我指的是一般意义上的“你”。当然,在同一个文件中不能有多个同名的符号。忘记了我之前评论时已经有一个Q&a解释了这一点,可以省去你自己写答案的麻烦。>出于某种原因,这是上周第二次或第三次出现这个问题。
(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
$1 = (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
$3 = {0, 0, 0, 0}
$1 = (char **) 0x7ffff7fa0250 <buffer>