2013-06-07 2 views
0

멀티 스레드 환경에서 프로그램을 실행하고 있는데 어느 시점에서 실패합니다. 내가 gdb를 시도했을 때 다음 오류가 발생했다.프로그램 수신 신호 SIGSEGV, 세분화 오류

프로그램 수신 신호 SIGSEGV, 세그먼트 오류.

C/mgmt.c에서 process_incomplete_rows (결과 집합 = 0x507950)의 0x00007ffff7aa42b9 [0x7fff677b700 (LWP 2777)를 스레드로 전환되지] 479 479 C/mgmt.c : 그런 파일이나 디렉토리.

mgmt.c 파일이 있으며이 코드는 일부 옵션에서는 잘 작동하지만 2 개 또는 3 개의 옵션에서이 오류가 발생합니다. 이 오류의 원인은 무엇입니까? comiplation 또는 coe에있는 그것의 과실? 또는 일부 데이터에 액세스하는 동안 오류가 있습니까?

+0

세그먼트 화 오류가 컴파일 타임에 rumtime 오류입니다. 컴파일 시간에 경고가 표시 될 수 있습니다. –

+0

앱을 실행하는 동안 'Valgrind'를 사용하여 자세한 정보를 얻을 수 있으며 직접 추적 할 수 있습니다. : //spin.atomicobject.com/2013/01/13/exceptions-stack-traces-c/). 'Valgrind'는 당신이 어떤 경우에 당신에게 이야기 할 것입니다 (물건의 끝을 지나쳐 쓰는 ...). –

답변

4

세그먼트 오류는 일반적으로 잘못된 포인터를 참조하기 때문에 발생하는 런타임 오류입니다. 일반적으로 유효하지 않은 포인터는 초기화 된 적이 없지만 이전 포인터를 재사용하거나 할당 된 메모리 청크의 끝을 지나서 쓰는 경우가 있습니다 (예 : 문자열의 끝을 지나면).

+0

내 경우에는 problrm로 인해 참조가 되었습니까? 그것을 보여주고있다. 79 c/mgmt.c : 그런 파일이나 디렉토리가 없다. – user2298595

+0

오류 메시지에 따르면, 그것은'c/mgmt.c' 파일의 479 행에 문제가 있기 때문입니다. 그 줄 주변의 코드는 무엇입니까? –

+0

if (node-> result_row). 여기서 노드는 구조체입니다. – user2298595

0

아마도 node 변수가 NULL이거나 손상되었음을 의미합니다. 디버거에서 프로그램을 실행하고 충돌 이전의 어느 시점부터 단계적으로 실행하여 문제가 발생한 곳을 확인하십시오. 또는 Purify 나 Insure ++와 같은 자동화 도구 중 하나를 사용하여 추적 할 수 있습니다.

관련 문제