문제

다음 출력으로 역통을 줄 때란 무엇을 의미합니까?

#0  0x00000008009c991c in pthread_testcancel () from /lib/libpthread.so.2
#1  0x00000008009b8120 in sigaction () from /lib/libpthread.so.2
#2  0x00000008009c211a in pthread_mutexattr_init () from /lib/libpthread.so.2
#3  0x0000000000000000 in ?? ()

이 프로그램은 표준 신호 11, 세그먼테이션 오류와 함께 충돌했습니다. 내 응용 프로그램은 pthread를 스레딩 라이브러리로 사용하여 FreeBSD 6.3에서 실행되는 다중 스레드 FASTCGI C ++ 프로그램입니다.

정보 소스에 따르면 -G로 컴파일되었으며 소스의 모든 기호 테이블이로드되었습니다.

분명히, 내 실제 코드 중 어느 것도 추적에 나타나지 않지만 대신 오류는 표준 pthread 라이브러리에서 발생하는 것 같습니다. 특히, 무엇입니까 ?? () ????

편집하다: 결국 기본 코드의 표준 유효하지 않은 메모리 액세스로 충돌을 추적했습니다. 스택 추적이 왜 손상되었는지 설명하지 않지만 다른 날에 대한 질문입니다. :)

도움이 되었습니까?

해결책

GDB는 pthread_mutexattr_init에서 적절한 반환 주소를 추출 할 수 없었습니다. 0의 주소가 있습니다. "??" 기호 테이블에서 주소 0을 찾아 보는 결과입니다. 상징적 인 이름을 찾을 수 없으므로 기본값 "?"를 인쇄합니다.

불행히도 오른쪽으로 나는 그것이 올바른 반환 주소를 추출 할 수없는 이유를 모른다.

다른 팁

스레딩 라이브러리가 충돌하게 한 것. 스레딩 라이브러리 자체는 디버깅 기호 (-G)로 컴파일되지 않으므로 소스 코드 파일 또는 라인 번호를 표시 할 수 없습니다. 또한 스레드이므로 통화 스택은 파일을 다시 가리키지 않습니다. 불행히도 이것은 추적하기 어려운 버그가 될 것입니다. 코드를 밟고 충돌이 발생할 때 좁아지면서 좁혀야합니다.

디버그 기호로 컴파일해야합니다. (GCC의 경우 -G 옵션이라고 생각합니다). 그런 다음 GDB에서 더 흥미로운 정보를 얻을 수 있어야합니다. 프로덕션 버전을 컴파일 할 때 끄는 것을 잊지 마십시오.

나는 무언가를 놓칠 수 있지만 이것은 누군가를 사용하는 사람을 나타내는 것은 아닙니다. NULL 기능 포인터로?

#include <stdio.h>

typedef int (*funcptr)(void);

int
func_caller(funcptr f)
{
    return (*f)();
}

int
main()
{
    return func_caller(NULL);
}

GDB에서 실행하면 동일한 스타일의 배경 트레이스를 생성합니다.

rivendell$ gcc -g -O0 foo.c -o foo
rivendell$ gdb --quiet foo
Reading symbols for shared libraries .. done
(gdb) r
Starting program: ...
Reading symbols for shared libraries . done

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000000
0x00000000 in ?? ()
(gdb) bt
#0    0x00000000 in ?? ()
#1    0x00001f9d in func_caller (f=0) at foo.c:8
#2    0x00001fb1 in main () at foo.c:14

그래도 이것은 꽤 이상한 충돌입니다 ... pthread_mutexattr_init 데이터 구조를 할당하는 것 이상의 일은 거의없고 memset 그것. 나는 다른 일이 일어나고있는 것을 찾을 것입니다. 일치하지 않는 스레딩 라이브러리 등의 가능성이 있습니까? 나의 BSD 지식은 약간 날짜가 있지만, 이것에 관한 문제가 있었다.

충돌을 일으킨 버그가 스택을 깨뜨 렸을까요 (스택의 덮어 쓰기 부분)? 이 경우 배경계는 쓸모가 없을 수 있습니다. 그 경우에 무엇을 해야할지 모르겠습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top