GDB смотреть указатель, который еще не действителен - PullRequest
1 голос
/ 02 июля 2010

У меня есть следующий код:

#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.36,4, 6,6, 6,8, 7,0 и 7,1

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 июля 2010

По какой-то причине я использовал 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)

Надеюсь, это поможет кому-то еще.

ПРИМЕЧАНИЕ. Я пыталсядобавив это как комментарий в посте Нила, но поскольку он не был отформатирован, я предпочел написать ответ на мой вопрос.

0 голосов
/ 02 июля 2010

Установите часы после выделения памяти с помощью 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]
...