2011-02-13 2 views
0

나는 segfault를 던지는 C 프로그램을 가지고있다. 그러나 gdb를 사용하여 오류가 발생한 위치를 확인합니다. 나는 스택 정보를 얻습니다. 왜 # 1이 ??()를 가리키는 지 이해할 수 없습니다. 이것에 대한 가능한 이유는 무엇입니까? 감사.C 프로그램의 디버그에서

#0 __longjmp() at ../sysdeps/i386/__longjmp.S:68 
#1 0x43746a57 in ??() 

답변

1

gdb는 함수의 이름을 모르기 때문에 ??을 넣습니다.

디버그 기호로 컴파일 해 보셨습니까?

2

프로그램을 디버깅하려면 포함 된 디버깅 기호로 컴파일해야합니다. GCC를 사용하여 컴파일하는 경우 -g3 플래그를 사용하여 수행 할 수 있습니다. GDB에서 프로그램의 디버그 버전을 실행하고 bt ("backtrace"를 위해)을 실행하면 더 현명한 출력을 얻을 수 있습니다. 중 하나 setjmp() 호출에 의해 초기화하지 않은 jmpbuf를 전달하여, 또는에서 설정 한 jmpbuf을 전달하여 - 다음 문제는 당신이 그것을 악용하고 있다는 것입니다 보인다 longjmp() 만약

+0

감사합니다. 내가 제대로 이해하는지 모르겠다. 나는 다음을 시도했다 : 'gcc -g3 XXX' 그리고 gdb를 실행한다. 충돌과 타이핑 bt 이후에, gdb는 똑같은 것을 출력합니다. 지금은 아이디어가 없습니다. – Richard

+0

흠 ..이 크래시가 사용중인 라이브러리에서 발생했을 수 있습니다. 이 경우 링커 규칙을 변경하여 라이브러리의 디버그 버전과 연결해야합니다. 또는 로깅을 추가하여이 오류가 발생한 위치를 대략적으로 추적 할 수 있습니다. 그 주위에 약간의 코드를 게시하면 오류를 발견 할 수 있습니다. 간단한 로깅을 위해 google-glog를 사용할 수 있습니다. http://code.google.com/p/google-glog/ –

+0

os 커널에서 예외가 발생할 수 있습니까? 이 경우 어떻게 디버그해야합니까? (나는 -g로 컴파일 된 lib 코드를 사용한다고 생각한다.) 또한 디버그에 없으면 segfault가 throw되지 않는다. – Richard

0

타락 간다 그 후 반환 된 루틴.

디버깅 정보를 확인하는 방법에 대한 자세한 내용은 -g 옵션을 사용하여 다른 답변 및 컴파일을 참조하십시오.