我调试一个定义指针数组的示例程序:
int a = 1, b = 2, c = 3;
int* t[] = {&a, &b, &c};
我想在调试期间将数组中的所有指针设置为 NULL。当我使用以下命令时:
call memset(t, 0x0, sizeof(int*)*3)
我得到这个输出:
$3 = (void *(*)(void *, int, size_t)) 0x7ffff77e7e10 <__memset_avx2_unaligned_erms>
当我打印时,数组指针未设置为 NULL:
(gdb) print t
$4 = {0x7fffffffddc0, 0x7fffffffddc4, 0x7fffffffddc8}
出了什么问题?
最佳答案
I get this output:
您得到此输出是因为在您的 GLIBC 版本 memset
中是 GNU indirect function 。它不写入任何内存,它返回实际实现的地址(在您的情况下为 __memset_avx2_unaligned_erms
)。
您可以验证情况是否如此:
$ readelf -Ws /lib64/libc.so.6 | grep ' memset'
1233: 00000000000b2df0 241 IFUNC GLOBAL DEFAULT 14 memset@@GLIBC_2.2.5
557: 00000000000b2df0 241 FUNC LOCAL DEFAULT 14 memset_ifunc
6000: 00000000000b2df0 241 IFUNC GLOBAL DEFAULT 14 memset
要实际设置内存,需要调用实现函数,例如__memset_avx2_unaligned_erms
.
附注至memset
一个由 3 个指针组成的数组,单独设置每个指针会更容易:(gdb) t[0]=0
。但我假设您实际想要归零的对象更大。
为了便于调试,您可以编写一个简单的 local_memset()
并调用它。
关于c - gdb - 如何为指针数组调用 memset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73587023/