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

标签 c debugging gdb memset

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

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/

相关文章:

c - 为什么数字 '0'(数字,不是字符)不显示?

c - 在一行中输出 C 语言中的 system()

java - Java 有功能级调试/日志记录工具吗?

ruby - 调试线程化的 ruby​​ 应用程序

pycharm调试器中的python 3.4 AssertionError

ubuntu - 使用 Eclipse CDT gui wrapper for gdb 分析转储

c - 删除文本文件中的一行 (Windows)

c - 一行最多打印 50 个字符,如果参数为 55,则打印新的一行字符

c++ - 崩溃后检查 gdb 回溯中的 C++ 对象

c - 在C中检查正在运行的进程的变量