2014-01-31 79 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

相關問題