當數據類覆蓋的整個內存範圍發生改變時,是否有辦法中斷?
也許吧。
GDB硬件觀察點在硬件中使用特殊的調試寄存器,並且通常會限制這些寄存器的工作方式。在x86
,你可以設置4個字大小的硬件觀看點,例如,你給了你可以設置觀察點&data->a
和&data->b
,這將「覆蓋」data
的整個內存。
我猜你的實際data
有更多的成員,所以4個字的大小的觀察點是不夠的。
如果您對平臺具有Valgrind的支持,如果您的程序可以Valgrind的下執行,那麼你可以使用的內存任意地區Valgrind的的內置gdbserver設置觀察點。
更新:
我通過你鏈接到網頁看了看,並沒有找到我要找的
我不知道你所期待的。下面是一個演示如何工作的示例會話:
#include <stdlib.h>
void foo(char *p)
{
*p = 'a';
}
typedef struct {
char buf[1024];
} data;
int main()
{
data *d = calloc(1, sizeof(data));
foo(d->buf + 999);
}
gcc -g main.c
valgrind --vgdb-error=0 ./a.out
...
==10345== TO DEBUG THIS PROCESS USING GDB: start GDB like this
==10345== /path/to/gdb ./a.out
==10345== and then give GDB the following command
==10345== target remote | vgdb --pid=10345
... Valgrind現在等待調試器附加。
在另一個窗口:
gdb ./a.out
GNU gdb (GDB) 7.4
...
(gdb) target remote | vgdb --pid=10345
relaying data between gdb and process 10345
[Switching to Thread 10345]
0x0000000004000af0 in _start() from /lib64/ld-linux-x86-64.so.2
(gdb) b main
Breakpoint 1 at 0x40053d: file main.c, line 14.
(gdb) c
Breakpoint 1, main() at main.c:14
14 data *d = calloc(1, sizeof(data));
(gdb) n
15 foo(d->buf + 999);
(gdb) watch *d
Hardware watchpoint 2: *d
請注意, 「硬件」 監視點已設置整個*d
。 只有在Valgrind是硬件的意義上,它纔是硬件觀察點。
(gdb) p d.buf[999]
$1 = 0 '\000'
(gdb) c
Hardware watchpoint 2: *d
Old value = {buf = '\000' <repeats 1023 times>}
New value = {buf = '\000' <repeats 999 times>, "a", '\000' <repeats 23 times>}
foo (p=0x51b6457 "a") at main.c:6
6 }
(gdb) q
瞧:當第999元素被修改的調試器停止,證明觀察點「覆蓋」的整個結構。
謝謝。你能否提供更多關於valgrind的信息?我瀏覽了您鏈接到的頁面,但無法找到我正在尋找的內容 – ewok
@ewok我更新了答案。 –