如何将gdb观察点设置为存储在寄存器中的值?

时间:2014-06-04 13:39:11

标签: debugging gdb stack-overflow breakpoints buffer-overflow

我正在尝试检测某些函数中的堆栈溢出,并希望将观察点设置为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的断点,但不应该。错误?

1 个答案:

答案 0 :(得分:7)

gdb不允许您明确取消引用(void *)指针,例如$rsp。它不知道指向值的大小或格式。

改为watch *(char *)$rspwatch *(int *)$rsp等。