我有以下代码:
#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
由于
答案 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的帖子中添加此作为评论,但由于它没有格式化,我更喜欢写一个问题的答案。