我除錯了一個定義指標陣列的示例程式:
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}
怎么了 ?
uj5u.com熱心網友回復:
我得到這個輸出:
你得到這個輸出是因為在你的 GLIBC 版本中memset
是一個GNU 間接函式。它不寫入任何記憶體,它回傳實際實作的地址(__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
.
PS 對于memset
一個由 3 個指標組成的陣列,簡單地單獨設定每個指標會更容易:(gdb) t[0]=0
. 但我假設你真正想要歸零的物件更大。
為了便于除錯,您可以撰寫一個 triviallocal_memset()
并呼叫它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/504942.html
上一篇:在SQL中創建表時引發錯誤