2014-01-31 78 views
0

在使用GDB调试崩溃时,我发现程序在ASSERT()中崩溃。奇怪的是,指针包含0x0指向有效数据。为什么0x0指向有效数据

示例代码:

#define MAX_NUM 10; 
... 
... 
assert(x->y != NULL); 
assert(x->y->z < MAX_NUM); <-- Crashes here 

我可以看到 'X' 指向一个有效的地址。当我这样做时:

(gdb) print x 
$16 = 0x841eda3 
(gdb) print x->y 
$17 = 0x0 
(gdb) print *x->y 
$18 = { 
     ... 
     ... 
     z = 1; 
     ... 
} 

这怎么可能?我不应该从GDB得到“无法访问地址为0x0的内存”错误吗?

+2

这是数据,但您确定它是有效的数据吗? – John3136

+0

是的,'y'的所有字段看起来都很健全。 – adizone

+0

@aditya:当你打印*(x-> y)时会发生什么 - 它是否给你比'print * x-> y'和'print(* x) - > y'不同的结果? – Brendan

回答

0

什么版本的GDB?

核心转储并不总是说实话。他们可以通过很多方式搞砸。我有核心转储看起来有效,不是。我想你很幸运,看起来很正确。

+0

我正在使用gdb6.6 – adizone

相关问题