TJ *_*oks 236 debugging gdb breakpoints
我正在通过gdb运行应用程序,我想在访问/更改特定变量的任何时候设置断点.有这么好的方法吗?我也有兴趣用其他方法监视C/C++中的变量,看看它是否/何时发生变化.
ask*_*sol 277
手表上只写符,rwatch让你读破发,并awatch让你打破的读/写.
您可以在内存位置设置读取观察点:
gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface
Run Code Online (Sandbox Code Playgroud)
但是一个限制适用于rwatch和awatch命令; 你不能在表达式中使用gdb变量:
gdb$ rwatch $ebx+0xec1a04f
Expression cannot be implemented with read/access watchpoint.
Run Code Online (Sandbox Code Playgroud)
所以你必须自己扩展它们:
gdb$ print $ebx
$13 = 0x135700
gdb$ rwatch *0x135700+0xec1a04f
Hardware read watchpoint 3: *0x135700 + 0xec1a04f
gdb$ c
Hardware read watchpoint 3: *0x135700 + 0xec1a04f
Value = 0xec34daf
0x9527d6e7 in objc_msgSend ()
Run Code Online (Sandbox Code Playgroud)
编辑:哦,顺便说一下.您需要硬件或软件支持.软件显然要慢得多.要了解您的操作系统是否支持硬件观察点,您可以查看can-use-hw-watchpoints环境设置.
gdb$ show can-use-hw-watchpoints
Debugger's willingness to use watchpoint hardware is 1.
Run Code Online (Sandbox Code Playgroud)
小智 23
假设第一个答案是指C语法,(char *)(0x135700 +0xec1a04f)
那么答案rwatch *0x135700+0xec1a04f
是不正确的.正确的语法是rwatch *(0x135700+0xec1a04f)
.
()
那里缺乏s导致我试图自己使用观察点的痛苦.
我只是尝试了以下内容:
$ cat gdbtest.c
int abc = 43;
int main()
{
abc = 10;
}
$ gcc -g -o gdbtest gdbtest.c
$ gdb gdbtest
...
(gdb) watch abc
Hardware watchpoint 1: abc
(gdb) r
Starting program: /home/mweerden/gdbtest
...
Old value = 43
New value = 10
main () at gdbtest.c:6
6 }
(gdb) quit
Run Code Online (Sandbox Code Playgroud)
所以看起来可能,但你确实需要一些硬件支持.