我正在通过gdb运行应用程序,我想在访问/更改特定变量的任何时候设置断点 . 有这么好的方法吗?我也有兴趣用其他方法来监视C / C中的变量,看看它是否/何时发生变化 .
假设第一个答案是指类C语法 (char *)(0x135700 +0xec1a04f) 那么做 rwatch *0x135700+0xec1a04f 的答案是不正确的 . 正确的语法是 rwatch *(0x135700+0xec1a04f) .
(char *)(0x135700 +0xec1a04f)
rwatch *0x135700+0xec1a04f
rwatch *(0x135700+0xec1a04f)
由于缺乏_489400,我试图自己使用观察点造成了很大的痛苦 .
您正在寻找的是一个观察点 .
Usage
(gdb) watch foo :注意 variable foo 的值
(gdb) watch foo
foo
(gdb) watch *(int*)0x12345678 :观察 address 指向的值,投射到您想要的任何类型
(gdb) watch *(int*)0x12345678
(gdb) watch a*b + c/d :任意 complex expression ,在程序的母语中有效
(gdb) watch a*b + c/d
观察点有三种:
watch :写入发生时gdb将中断
rwatch :gdb会在读取发生时中断
awatch :两种情况下gdb都会中断
您可以选择更适合您的需求 .
有关更多信息,请查看this .
使用watch来查看变量的写入时间,rwatch在读取时读取,并在读取/写入变量时进行唤醒,如上所述 . 但请注意,要使用此命令,必须中断程序,并且当您破坏程序时变量必须在范围内:
使用watch命令 . 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 ()
Edit: 哦,顺便说一下 . 你需要硬件 or software support . 软件显然要慢得多 . 要了解您的操作系统是否支持硬件观察点,您可以查看can-use-hw-watchpoints环境设置 .
gdb$ show can-use-hw-watchpoints Debugger's willingness to use watchpoint hardware is 1.
我只是尝试了以下内容:
$ 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
所以似乎可能,但你似乎需要一些硬件支持 .
5 回答
假设第一个答案是指类C语法
(char *)(0x135700 +0xec1a04f)
那么做rwatch *0x135700+0xec1a04f
的答案是不正确的 . 正确的语法是rwatch *(0x135700+0xec1a04f)
.由于缺乏_489400,我试图自己使用观察点造成了很大的痛苦 .
您正在寻找的是一个观察点 .
Usage
(gdb) watch foo
:注意 variablefoo
的值(gdb) watch *(int*)0x12345678
:观察 address 指向的值,投射到您想要的任何类型(gdb) watch a*b + c/d
:任意 complex expression ,在程序的母语中有效观察点有三种:
watch :写入发生时gdb将中断
rwatch :gdb会在读取发生时中断
awatch :两种情况下gdb都会中断
您可以选择更适合您的需求 .
有关更多信息,请查看this .
使用watch来查看变量的写入时间,rwatch在读取时读取,并在读取/写入变量时进行唤醒,如上所述 . 但请注意,要使用此命令,必须中断程序,并且当您破坏程序时变量必须在范围内:
只有在写入时才会中断,rwatch会让您在读取时中断,而awatch会让您在读/写时中断 .
您可以在内存位置设置读取观察点:
但是一个限制适用于rwatch和awatch命令;你不能在表达式中使用gdb变量:
所以你必须自己扩展它们:
Edit: 哦,顺便说一下 . 你需要硬件 or software support . 软件显然要慢得多 . 要了解您的操作系统是否支持硬件观察点,您可以查看can-use-hw-watchpoints环境设置 .
我只是尝试了以下内容:
所以似乎可能,但你似乎需要一些硬件支持 .