2011-01-26 6 views
3

리눅스에서 긴 프로그램을 가지고 있는데, 메인 반환 후에 세그먼트 오류가 발생합니다. 긴 프로그램이므로 게시 할 수 없습니다. 그런 오류를 만들 수있는 도움을 주시겠습니까?메인 반환 후 세그먼트 화 오류가 발생했습니다.

감사합니다.

와우, 그 대답은 정말 빨랐습니다. 다들 감사 해요. 나는 그것을 해결했다고 생각하는데, 문자열을 malloc하는 것을 잊어 버렸고 버퍼로 사용했다. 이제 저는 그것을 할당했습니다. 세그먼트 오류로 인해 신호를 보내지 않습니다.

다시 한 번 감사의 말씀을 전합니다.

+0

이 스레드를 사용해보십시오 : http://stackoverflow.com/questions/3718998/methodology-for-fixing-segmentation-faults-in-c – CanSpice

+0

한 줄의 코드 만 보지 않고도 무작위 응답. 그러나 일반적으로 포인터 관련 작업 (버퍼 오버 플로우 포함) 또는 스택 손상이 있습니다. –

+0

void를 반환하는 것으로 주 함수를 선언 했습니까? –

답변

1

GDB를 사용하고 SIGSEGV 신호에서 스택 추적을 인쇄하십시오. 그러면 적어도 이라고 게시하면 여기에 우리는 좀 더 도움이 될 수 있습니다.

은 당신이 컴파일 제공 :

$ gcc -g prog.c -o prog 

그리고 GDB에서 실행 : 당신이 SIGSEGV 신호 (분할 오류)를 얻을 때

$ gdb ./prog 
gdb> r 

는 다음을 수행

gdb> bt 

다음 스택 추적에 무엇이 있는지 확인하여 세그멘테이션 오류의 원인을 확인하십시오.

3

추측 : 실수로 메인 스택이 손상되어 반송 주소가 손실 될 수 있습니다. 거기에 버퍼 오버런이있을 수 있습니까? 그렇지 않으면

, 당신은 시도해야합니다 :

  • 는 충돌을 잡아 당신이 그 시점에서 어디에 볼 수 gdb를 사용하여 프로그램을 디버깅 Valgrind의
  • 에서 프로그램을 실행; 당신은 또한 코어 파일이
그것은 당신이 그 시점에서 glibc는 코드에있을거야 이후 배포판을 경우의 glibc-디버그 패키지를 설치하는 데 도움이 될 수

을 덤프 디버깅 할 수 있습니다.

1

main()이 반환 한 후에 세분화 오류가 발생하면 대개 전역 정의 된 항목이 잘못되었음을 나타냅니다. 작은 정보만으로도 당신을 도울 수 없습니다. 우리에게 더 많은 정보를 보내주십시오!

my2c

1

main()의 복귀 후, 다음 (I이 몇 가지를 꾸며 낼하도록 구현 과거를 생각하지 않을 수 있지만) 모든 소멸자가 실행 된 표준에 따라, 기능 atexit()하지 않는 한 사용되었습니다이 있다면. 이 함수는 main()이 반환하는 함수를 호출합니다 (실제로 3.6.3을 읽었을 경우). 완전성을 위해서만 어딘가에 프로그램에 atexit이 있는지 확인할 수 있습니다.

"main returns after"의 의미에 따라 프로그램이 충돌 할 때 정적 객체에 대한 소멸자가 실행 중일 수 있습니다. 그것들을 확인하십시오. (또한, 당신이 관찰 한 것을 게시하여 main()이 반환 된 이후라고 생각하게 만들었습니다. 거기에 잘못 될 수 있습니다.)

그렇다면 어딘지에서 스택을 손상시킬 가능성이 높은 정의되지 않은 동작이 어딘가에서 호출되었습니다. Rup의 제안에 대한 답변을 참조하십시오.

관련 문제