debugging gdb -如何为指针数组调用memset

csga3l58  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(206)

我调试了一个定义指针数组的示例程序:

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}

有什么不对吗?

jbose2ul

jbose2ul1#

我会得到以下输出:
你得到这个输出是因为在你的GLIBC版本中memsetGNU 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

要实际设置内存,需要调用 implementation 函数,如__memset_avx2_unaligned_erms
P.S.对于memset的3个指针数组,简单地分别设置每个指针会更容易:(gdb) t[0]=0。但是我假设你实际上想归零的对象更大。
为了便于调试,您可以编写一个简单的local_memset()并调用 it

s2j5cfk0

s2j5cfk02#

根据Employed Russian的答案,插入()并使用

call memset()(t, 0x0, sizeof(int*)*3)

这是因为memset()返回您实际要调用的函数。

相关问题