gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:57:04 25 4
gpt4 key购买 nike

我正在尝试检测某些函数中的堆栈溢出,并希望将观察点设置为 RSP 寄存器指向的内存。我不能只将观察点设置到某个地址,因为可以从不同的地方调用该函数。所以我想在函数的开始和结束时设置断点,并强制它们启用/禁用观察点。

但是设置观察点的任何一种方式都不适合我。例如。 wa $rsp 监视寄存器;

set $myvar = $rsp
wa $myvar

使观察点跟踪... $myvar! 的更改!不是它存储的值(value)!

很奇怪,我敢肯定,这应该是一种方法,但我不知道......

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 设置了一个断点,虽然不应该。错误?

最佳答案

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

watch *(char *)$rspwatch *(int *)$rsp 等,而不是观察寄存器指向的变化至。 (要么通过内存写入,要么通过寄存器更改为指向其他位置。)

使用 watch -l *(int*)$rsp 将监视该 4 字节内存位置的更改,即使以后 $rsp 发生更改。 (截图地址)。

在 x86 CPU 上,watch -l 可以使用硬件观察点,这与没有 -l 的情况不同,它会监视评估整个表达式时的变化。

关于debugging - 如何将 gdb 观察点设置为存储在寄存器中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24039024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com