2012-09-07 93 views
2

我有一個定義在C++中的對象,它有一個指向它的指針,用於整個項目中的各種函數和文件。我正在更新數據時遇到問題,所以我想調試它以查看正在發生的事情。理想情況下,每當訪問對象時我都想打破它。然而,watch需要一個特定的內存地址。因此,舉例來說,如果我有:當一個特定的對象被改變時gdb:破壞

class data{ 
public: 
    int a; 
    int b; 
}; 

然後GDB會只有突破時a被改變,因爲數據指針正指向a,而不是當b改變。

data類覆蓋的整個內存範圍發生改變時,是否有辦法中斷?

回答

4

當數據類覆蓋的整個內存範圍發生改變時,是否有辦法中斷?

也許吧。

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元素被修改的調試器停止,證明觀察點「覆蓋」的整個結構。

+0

謝謝。你能否提供更多關於valgrind的信息?我瀏覽了您鏈接到的頁面,但無法找到我正在尋找的內容 – ewok

+0

@ewok我更新了答案。 –

相關問題