gdb监视指针尚无效

时间:2010-07-02 15:04:13

标签: c gdb watchpoint

我有以下代码:

#include <stdlib.h>
#include <stdio.h>

#define SIZE 100

int* arr;

main()
{
    int i;

    arr = (int*)malloc(SIZE*sizeof(int));

    if (arr == NULL) {
        printf("Could not allocate SIZE(=%d)", SIZE);
    }

    for (i=0; i<SIZE; i++) {
        arr[i] = 0;
    }

    free(arr);
}

我不想看arr[10]并查看该数组元素何时被修改。

我该怎么做? gdb说以下内容:

$ gcc -g main.c
$ gdb a.out
...
(gdb) watch arr[10]
Cannot access memory at address 0x28

有没有办法让gdb看到无效的内存,只有当它变得有效时才停止?

PS:我有gdb版本6.0,6.3,6.4,6.6,6.8,7.0和7.1

由于

2 个答案:

答案 0 :(得分:0)

在使用malloc分配内存后设置监视。

(gdb) b main
Breakpoint 1 at 0x401321: file w.c, line 9.
(gdb) run
Starting program: D:\Users\NeilB/a.exe
[New thread 432.0x53c]

Breakpoint 1, main () at w.c:9
9       {
(gdb)
(gdb) n
12          arr = (int*)malloc(SIZE*sizeof(int));
(gdb) n
14          if (arr == NULL) {
(gdb) watch arr[10]
Hardware watchpoint 2: arr[10]

答案 1 :(得分:0)

出于某种原因,我正在使用gdb-6.3(它在我的PATH中,我没注意到它)。但是,当我尝试使用gdb-7.1时,它工作正常!

从gdb 7.0开始,您可以观看不属于您的内存。

使用以下源代码:

#include <stdlib.h>
#include <stdio.h>

#define SIZE 100

int* arr;

main()
{
    int i;

    arr = (int*)malloc(SIZE*sizeof(int));

    if (arr == NULL) {
        printf("Could not allocate SIZE(=%d)", SIZE);
    }

    for (i=0; i<SIZE; i++) {
        arr[i] = i; /* So it changes from malloc */
    }

    free(arr);
}

您可以编译:

$ gcc -g -o debug main.c

然后调试:

$ gdb debug
GNU gdb (GDB) 7.1
...
(gdb) watch arr[10]
Watchpoint 1: arr[10]
(gdb) run
Starting program: /remote/cats/gastonj/sandbox/debug/debug
Hardware watchpoint 1: arr[10]

Old value = <unreadable>
New value = 0
main () at main.c:14
14          if (arr == NULL) {
(gdb) cont
Continuing.
Hardware watchpoint 1: arr[10]

Old value = 0
New value = 10
main () at main.c:18
18          for (i=0; i<SIZE; i++) {
(gdb) cont
Continuing.

Program exited with code 01.
(gdb)

希望对其他人有帮助。

注意:我尝试在Neil的帖子中添加此作为评论,但由于它没有格式化,我更喜欢写一个问题的答案。