2014-01-31 3 views
0

GDB를 사용하여 크래시를 디버깅하는 동안 ASSERT()에서 프로그램이 충돌하는 것을 발견했습니다. 이상한 점은 포인터가 유효한 데이터를 가리키는 0x0을 포함한다는 것입니다.0x0이 유효한 데이터를 가리키는 이유

샘플 코드 : 나는 'X'올바른 주소를 가리키는 것을 알 수 있습니다

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

. 내가 할 때 :

(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 :'print * (x-> y)'를하면 어떻게 될까요?'print * x-> y'와'print (* x) -> y'와는 다른 결과를 줍니까? – Brendan

답변

0

GDB의 버전은 무엇입니까?

코어 덤프가 항상 진실을 말하지는 않습니다. 여러면에서 엉망이 될 수 있습니다. 코어 덤프가 유효하고 올바르게 보이지 않았습니다. 나는 그것이 옳았다는 것을 당신이 단순히 운이 좋았다고 생각합니다.

+0

gdb6.6을 사용하고 있습니다. – adizone

관련 문제