我正在通过gdb运行一个应用程序,我想在访问/更改特定变量时设置一个断点。有什么好的方法吗?我也对监视C/ c++中的变量的其他方法感兴趣,以查看它是否/何时发生变化。
当前回答
如上所述,使用watch查看变量何时被写入,rwatch查看变量何时被读取,awatch查看变量何时被读取/写入/到。但是,请注意,要使用这个命令,你必须中断程序,并且当你中断程序时,变量必须在作用域内:
使用watch命令。watch命令的参数是an 求值的表达式。这意味着你想要的变量 要将观察点设置为on,则必须在当前范围内。因此,要设置a 一个非全局变量上的观察点,则必须设置断点 这将在变量处于作用域中时停止程序。你设置 节目中断后的观察点。
其他回答
我尝试了以下方法:
$ 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
因此,这似乎是可能的,但您似乎确实需要一些硬件支持。
Watch只在写时中断,rwatch可以在读时中断,而awatch可以在读/写时中断。
你可以在内存位置上设置读观察点:
gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface
但是rwatch和awatch命令有一个限制;不能使用GDB变量 在表达式:
gdb$ rwatch $ebx+0xec1a04f
Expression cannot be implemented with read/access watchpoint.
所以你必须自己扩展它们:
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 ()
编辑:哦,顺便说一下。您需要硬件或软件支持。软件显然要慢得多。要了解您的操作系统是否支持硬件观察点,可以查看can-use-hw-watchpoints环境设置。
gdb$ show can-use-hw-watchpoints
Debugger's willingness to use watchpoint hardware is 1.
假设第一个答案引用的是类c语法(char *)(0x135700 +0xec1a04f),那么执行rwatch *0x135700+0xec1a04f的答案是不正确的。正确的语法是rwatch *(0x135700+0xec1a04f)。
由于缺少(),我在自己尝试使用观察点时感到非常痛苦。
如上所述,使用watch查看变量何时被写入,rwatch查看变量何时被读取,awatch查看变量何时被读取/写入/到。但是,请注意,要使用这个命令,你必须中断程序,并且当你中断程序时,变量必须在作用域内:
使用watch命令。watch命令的参数是an 求值的表达式。这意味着你想要的变量 要将观察点设置为on,则必须在当前范围内。因此,要设置a 一个非全局变量上的观察点,则必须设置断点 这将在变量处于作用域中时停止程序。你设置 节目中断后的观察点。
你要找的是观察点。
使用
(gdb) watch foo:观察变量foo的值
(gdb) watch *(int*)0x12345678:监视由地址指向的值,转换为您想要的任何类型
(gdb) watch a*b + c/d:查看任意复杂的表达式,在程序的母语中有效
观察点有三种:
注意:当发生写操作时,GDB将中断 Rwatch:当读取发生时,GDB将中断 注意:GDB在这两种情况下都会崩溃
您可以根据自己的需要选择更合适的。
要了解更多信息,请查看这个。
推荐文章
- 什么是“参数依赖查找”(又名ADL,或“Koenig查找”)?
- 公共朋友交换成员函数
- 如何在Go中使用c++
- 自定义c++分配器的引人注目的例子?
- RAII和c++中的智能指针
- 如何构建和使用谷歌TensorFlow c++ api
- 断言是邪恶的吗?
- 下面这些短语在c++中是什么意思:0 -,default-和value-initialization?
- 在STL地图中,使用map::insert比[]更好吗?
- C++ Linux的想法?
- 如何为Fedora安装g++ ?
- Std::cin输入空格?
- c++标准是否要求iostreams的性能很差,或者我只是在处理一个糟糕的实现?
- Xcode +删除所有断点
- 如何在Visual Studio中找到堆栈跟踪?