2008-10-16 2 views
0

Thread.race (Thread.getAllStackTraces()를 사용하여 stacktrace를 얻을 수 있음을 알고 있지만 (Map은 반환하지만 clear는 작동하지 않습니다). 재귀 메서드를 실행할 때 stacktrace가 너무 커서 예외가 생길 수 있습니다.이를 지울 수있는 방법이 있습니까?나는 stacktrace를 청소할 수 있습니까?

답변

4

문제를 일으키는 스택 추적이 아니라 스택 자체입니다. 메소드를 호출 할 때마다 호출 메소드로 돌아갈 수있는 정보가 스택에 저장됩니다. 당신이 충분히 재귀한다면 결국 스택의 모든 공간을 채우게되고 (최대 크기로 묶여 있음) 프로그램이 멈춘다. 스택 추적은 단순히 통화 기록을 보여줍니다. 프로그램이 실패하기 전에 무한 재귀가 발생할 가능성이 높으므로 프로그램을 중지하는 방법을 찾아야합니다. 알고리즘에 오류가 있거나 사용 가능한 메모리 경계 내에서 다르게 해결할 방법을 찾아야합니다.

1

재귀가 제어 불능으로 인해 스택 오버 플로우를 치는 경우 운이 없게됩니다. 함수 호출에서 반환하려면 스택의 내용이 필요하므로 현명하게 "정리"할 방법이 없습니다. 문제는 getAllStackTraces()에 의해 반환 된 Map이 아니라 스택의 실제 내용입니다.

코드를 다시 작성하여 깊은 수준으로 돌아 가지 않도록해야합니다.

또는 스택 크기를 늘릴 수 있는지 조사 할 수 있지만 비표준 스택 크기를 요구하는 것은 일반적으로 문제가있는 구현의 징후입니다.

-1

먼저 프로그램에 코드에 무한 재귀가 발생하여 스택 오버플로를 일으키는 버그가 없는지 확인합니다.

그렇지 않은 경우 더 많은 스택 공간을 프로그램에 할당하려고 할 수 있습니다. 당신이 정말로 스택은 당신이 C에서 setjmp는/롱 점프를 사용하거나 예외 또는 연속성을 사용할 수 있습니다 긴장을해야하는 경우

ulimit -s 8000 

또는

ulimit -s unlimited 

: 리눅스에서 당신은 같은 ulimit bash는 명령으로 할 수 있습니다 같은 :

struct ClearStack {} ; 

void myLongComputationWhichCausesStackOverflow() { 
    // do something 
    if (needsToClearTheStack) 
    throw ClearStack() ; 
    // do something else 
} 

int main(int ac, char *av[]) { 
    try { 
    mylongcomputation() ; 
    // continuation of program 
    // no stack clearing occurred 
    } 
    catch(const ClearStack & cs) { 
    // the stack was cleared and do something appropriately 
    } 
} 

그것은 당신이 원하는 것을하지만 정말 좋은 프로그래밍 스타일이 아니다. 스택을 지우는시기를 알 수있는 방법을 찾아야합니다. 스택 공간이 얼마 남았는지 알지 못하거나 함수를 호출하면 스택 오버플로가 발생하기 때문에 이것은 매우 어려울 수 있습니다!

+0

유용한 정보이지만이 질문에는 적용되지 않습니다. –

관련 문제