우분투 14.04에서 gcc 4.8.2와 함께 Hope 함수 프로그램을 사용하고 많은 수의 소수를 찾기 위해 매우 재귀 함수를 사용하고 있습니다. 그러나, 나는 세그먼트 오류를 얻을 : 0x000000000040e03f에 도달C stack odd behavior
cell=<error reading variable: Cannot access memory at address 0x7fffff7feff8> at runtime.c:250
주소 0x7fffff7feff8에 액세스 할 때 세그먼트 오류가 발생합니다.
reach 루틴이 수행하는 작업은 가비지 수집 마크 스윕을 사용하여 현재 표현식에서 도달 할 수있는 힙 항목의 표시를 해제하는 것입니다. 스택은 매우 깊은 (100000+ 전화)하지만, 스택 오버 플로우가되지 않습니다 :
base_memory = 0x7ffff35a4010
top_string = 0x7ffff35a5260
BaseHeap = 0x7ffff35a5260
heap = 0x7ffff603a450
stack = 0x7ffff72da498
TopStack = 0x7ffff7584d60
TopStack에 base_memory에서 영역 malloc에 할당되었다.
세그먼트 위반이 발생할 때마다 주소는 매우 다른 기능을 사용하더라도 항상 0x7fffff7feff8입니다.
Google의 주소가 0x7fffff7feff8 인 경우이 주소로 세그먼트 위반이있는 항목이 몇 개 있으며 문제가 해결되지 않았습니다.
힙 주소가 힙 범위에 있는지 확인하는 코드를 넣었지만 결코 실패하지 않았습니다.
나는
find 0x7ffff35a4010,0x7ffff7584d60,0x7fffff7feff8
아무것도 발견 된 GDB를했다.
주소가 0x7fffff7feff8
인데 왜 많은 문제가 있습니까? 스택 메커니즘에 문제가 있습니까? 아니면 플랫폼에서 어떤 식 으로든 코드를 변경해야합니까?
코드 위치> (BTW, 더 많은 정보를 얻으려면 큰 소수를 찾는 것이 좋습니다!) –
코드가 복잡하다고 생각합니다. 오류 주소 0x7fffff7feff8은 Google에서 꽤 많이 나타나는 것처럼 보이고 세그먼트 위반은 gdb를 사용하는 것이 의미가 없으므로 패턴이나 일반적인 오류의 일종이 있습니다. – DougT
'valgrind'에서 프로그램을 실행하면 문제가있는 곳을 알 수 있습니다. 당신이 이미 그것을했다면,이 코멘트를 건너 뛰십시오 :) – Diego