2010-06-09 2 views
30

내 프로그램이 NULL 포인터 또는 오래된 메모리에 액세스하고 있는지 알고 싶습니다.GDB에서 segfault가 발생한 주소를 알려주려면 어떻게해야합니까?

역 추적은 다음과 같습니다

 
Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 0x2b0fa4c8 (LWP 1333)] 
0x299a6ad4 in pthread_mutex_lock() from /lib/libpthread.so.0 
(gdb) bt 
#0 0x299a6ad4 in pthread_mutex_lock() from /lib/libpthread.so.0 
#1 0x0058e900 in ??() 

답변

47

하면 폴트 어드레스 신호가 발생했을 때 기입 된 $_siginfo 구조를 조사하고 결정할 수 NULL 포인터 역 참조가 있습니다.

+0

(GDB) P는 $에서 작동하지 않습니다 $ _siginfo'를 사용하여 구조체에 무엇이 있는지 확인하십시오. – nornagon

+0

이 확인이 지원되지 않습니다 추측'p- 형 _siginfo SH4 – To1ne

+0

사용을 사용하는이 아키텍처 :( – To1ne

0

은 GDB에서 프로그램을 실행합니다. segfault가 발생하면, GDB는 변수와 관련 주소와 함께 프로그램의 라인과 문장을 알려줄 것입니다.

GDB에서 "print"(p) 명령을 사용하여 변수를 검사 할 수 있습니다. 라이브러리 호출에서 크래시가 발생하면 "프레임"시리즈 명령을 사용하여 해당 스택 프레임을 볼 수 있습니다. 이 (void *) 0x0 (또는 소수)를 표시하는 경우를 다음

(gdb) p $_siginfo._sifields._sigfault.si_addr 

:

는 GDB 7 이상으로
+0

소스가있는 코드에는 segfault가 없습니다. – nornagon

+0

@nornagon :'bt' 명령은 오류가 발생했을 때 자신의 코드에서 있었던 위치를 알려주는 백 트레이스를 보여줍니다. – caf

+0

그래, 나도 알아,하지만 여전히 도움이 안돼 - 그것은 여러 인자로 라이브러리 함수 호출에 있었는데, 그 인수 중 어떤 것이 segfault를 일으키는 지 모르겠다. – nornagon

관련 문제