You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GDB设置watch断点后地址值变更未触发中断问题求助

GDB硬件监视断点未触发的问题解决

问题场景

我在调试进程时给地址0x60c010设置了硬件watchpoint,本想在该地址值变更时触发中断,但调用memset修改值后,断点完全没反应。操作流程如下:

初始查看内存值

(gdb) x/s 0x60c010
0x60c010:       "aaaaa"

设置硬件监视断点及触发命令

(gdb) watch *0x60c010
Hardware watchpoint 2: *0x60c010
(gdb) commands
Type commands for breakpoint(s) 2, one per line.
End with a line saying just "end".
>echo "changed!!!!"
>end

确认断点状态

(gdb) info breakpoints
Num     Type           Disp Enb Address            What
2       hw watchpoint  keep y                      *0x60c010
        echo "changed!!!!"

尝试修改内存值

(gdb) p (void*)memset(0x60c010,'c',5)
$2 = (void *) 0x60c010

确认内存值已变更

(gdb) x/s 0x60c010
0x60c010:       "ccccc"

问题:明明内存值已经变了,watchpoint却没触发进程中断。


原因分析

用p (void*)memset(...)在GDB命令行直接执行时,这个memset调用是在GDB自身的进程空间里跑的,不是在你正在调试的目标进程里。内存修改根本没发生在目标进程中,自然不会触发目标进程的硬件监视断点。


解决办法

要让内存修改操作发生在目标进程的地址空间里,有两种简单可行的方式:

方式1:用set命令直接修改内存

针对字符串这种固定长度的内存块,直接用set命令覆盖最直接:

(gdb) set {char[6]}0x60c010 = "ccccc"

执行这条命令后,watchpoint会立刻触发,输出预设的changed!!!!并中断进程。

方式2:用call命令让目标进程执行函数

如果必须调用memset这类函数,改用call命令,它会让被调试的目标进程执行该函数:

(gdb) call memset(0x60c010, 'c', 5)

这样内存修改发生在目标进程内,watchpoint会正常触发中断。


验证结果

执行上述任一正确操作后,GDB会输出类似内容,进程被成功中断:

Hardware watchpoint 2: *0x60c010

Old value = 97 'a'
New value = 99 'c'
changed!!!!

内容的提问来源于stack exchange,提问作者python3.789

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:45:04