Debugging 如何将gdb监视点设置为存储在寄存器中的值?
我试图在某个函数中检测堆栈溢出,并希望将观察点设置为RSP寄存器指向的内存。我不能只将观察点设置为某个地址,因为函数可以从不同的位置调用。因此,我想在函数的开始和结束处设置断点,并强制它们启用/禁用监视点 但这两种设置观察点的方法对我都不起作用。例如,Debugging 如何将gdb监视点设置为存储在寄存器中的值?,debugging,gdb,stack-overflow,breakpoints,buffer-overflow,Debugging,Gdb,Stack Overflow,Breakpoints,Buffer Overflow,我试图在某个函数中检测堆栈溢出,并希望将观察点设置为RSP寄存器指向的内存。我不能只将观察点设置为某个地址,因为函数可以从不同的位置调用。因此,我想在函数的开始和结束处设置断点,并强制它们启用/禁用监视点 但这两种设置观察点的方法对我都不起作用。例如,wa$rsp监视寄存器; set $myvar = $rsp wa $myvar 使监视点跟踪。。。$myvar的更改!不是它存储的价值 奇怪,我确定,这应该是一个方法,但我不知道一个 UPD:看起来我在gdb中发现了一个bug。二: (gdb)
wa$rsp
监视寄存器;
set $myvar = $rsp
wa $myvar
使监视点跟踪。。。$myvar的更改!不是它存储的价值
奇怪,我确定,这应该是一个方法,但我不知道一个
UPD:看起来我在gdb中发现了一个bug。二:
(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的断点,尽管不应该设置。Bug?gdb
不允许显式取消引用(void*)指针,例如$rsp
。它不知道指向的值的大小或格式
做
watch*(char*)$rsp
或watch*(int*)$rsp
等等。这太棒了!非常感谢,这很有效!