我正在尝试检测某些函数中的堆栈溢出,并希望将观察点设置为RSP寄存器指向的内存。我不能只将一个观察点设置到某个地址,因为可以从不同的地方调用该函数。所以我想在函数的开始和结束处设置断点,并强制它们启用/禁用观察点。
但设置观察点的方式都不适合我。例如。 wa $rsp
看着登记册;在
set $myvar = $rsp
wa $myvar
让watchpoint跟踪... $ myvar的变化!不是它存储的价值!
很奇怪,我敢肯定,这应该是一种方式,但我不知道......
UPD:看起来我在gdb中发现了一个错误。两个:
(gdb) wa *$rsp
Attempt to dereference a generic pointer.
(gdb) set $myvar = $rsp
(gdb) wa *$myvar
Attempt to dereference a generic pointer.
UPD:不知道为什么,但wa &*$myvar
设置了$ myvar的断点,但不应该。错误?
答案 0 :(得分:7)
gdb
不允许您明确取消引用(void *)指针,例如$rsp
。它不知道指向值的大小或格式。
改为watch *(char *)$rsp
或watch *(int *)$rsp
等。