这是../sysdeps/x86_64/memcpy.S中的一行,我在这行之后遇到了VM崩溃,所以我需要知道发生了什么。基本上我知道这就像复制rsi到rcx。但这是否意味着rsi和rcx本身应该都是有效地址? 因为当我输入“信息寄存器”时,我得到了:
rcx 0xfa7e828 262662184
rsi 0x9 9
当我使用“x / s”查看地址中的内容时,我得到了:
(gdb) x/s 0x7fb47787e820
0x7fb47787e820: ""
(gdb) x/s 0xfa7e828
0xfa7e828: <Address 0xfa7e828 out of bounds>
(gdb) p $rsi
$2 = 9
(gdb) x/s 0x9
0x9: <Address 0x9 out of bounds>
实际上“0x09”是我要复制到某个地方的值,而不是值的地址。那么是因为这行代码将“0x09”视为某个地址,因此得到了以下错误?
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
memcpy () at ../sysdeps/x86_64/memcpy.S:102
102 movq (%rsi), %rcx
如果有帮助,该行的回溯和代码是:
(gdb) bt
#0 memcpy () at ../sysdeps/x86_64/memcpy.S:102
#1 0x00007fb484688f68 in ?? ()
#2 0x00007fb4830399d1 in start_thread (arg=0x7fb464af8700) at pthread_create.c:301
#3 0x00007fb482d86b7d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:115
(gdb) l
97
98 L(1c): /* 8-byte once */
99 testb $8, %dl
100 jz L(1d)
101
102 movq (%rsi), %rcx
103 movq %rcx, (%rdi)
104
105 addq $8, %rsi
106 addq $8, %rdi
(gdb)
107
108 .p2align 4,, 4
109
110 L(1d): /* 16-byte loop */
111 andl $0xf0, %edx
112 jz L(exit)
113
114 .p2align 4
115
116 L(1loop):
非常感谢您的所有时间。
答案 0 :(得分:2)
GDB正在为您提供关键信息。源地址0x9超出范围,您要告知0x9实际上是要复制的值。因此,您不会向memcpy传递有效的源地址,而是传递值。
也许您传递的是变量x
而不是地址&x
:
...
x = 9;
memcpy(destination_address, x, N); //<-- should be &x
destination_address
必须考虑相同的因素。如果它是变量,则使用&
运算符取消引用。如果它是指针,则按原样传递。