2009-05-28 2 views
5

많은 C/C++/Fortran 및 다른 프로그래머가 "스택 오버플로"오류를 경험했을 것입니다. 내 질문은, 우리가 모니터링하거나 프로그램이 실행되는 동안 스택의 크기를 확인할 수 있도록 도구, 프로그램 또는 간단한 코드 조각이 있나요? 스택이 누적되어 결국 오버 플로우를 일으키는 지점을 정확히 찾아내는 데 도움이 될 수 있습니다.스택 크기를 모니터링하여 스택 오버플로를 방지하는 방법은 무엇입니까?

답변

1

당신을 위해 해줄 프로그램이 있는지 모르겠지만 스택 포인터가있는 곳에서 (적어도 C와 C++에서는) 쉽게 확인할 수 있습니다. 변수의 메모리 위치를 살펴보십시오. 정확한 위치는 아니지만 로컬 변수가 스택에 정의되어 있기 때문에 몇 바이트 내에 있어야합니다. 정확한 가치를 원하면 어셈블리를 통해 얻을 수 있다고 생각합니다.

프로그램이 충돌 할 때 스택 추적을 보는 것이 더 쉬울 수 있습니다.

+0

그리고 가장 낮은 스택 프레임 (main())의 지역 변수 주소를 전역 적으로 액세스 가능한 변수에 저장하는 경우 "g_my_stack_base"라고하면 approx_stack_size = my_local_function_variable - g_my_stack_base를 사용하여 함수의 대략적인 스택 크기를 확인할 수 있습니다. 추악하지만 작동합니다. 포인터 연산이 바이트를 반환하도록 char * 포인터를 사용해야합니다. – tucuxi

1

question을 (를) 보시기 바랍니다. 허용 된 답변은 Raymond Chen을 인용합니다.

분명히해야 할 경우 솔루션/도구는 플랫폼에 따라 다릅니다. 하나의 쉬운 트릭은 알려진 바이트 값 (예 : AA)으로 스택을 채우고이 값이없는 첫 번째 바이트의 위치를 ​​모니터링하는 것입니다. 이렇게하면 현재 스택 크기가 아닌 최대 스택 크기가 사용됩니다.

+0

동의합니다. 예를 들어 DSP/BIOS 운영 체제는 0xDEADBEEF 패턴으로 새로 할당 된 스택을 채우고이를 사용하여 스택 사용을 추적합니다. x86 프로세서의 다른 방법 (쉽게 구현되지 않고 OS에서 수행해야 함)은 스택을 별도의 세그먼트에 배치하는 것입니다. 그런 다음 OS는 할당 된 길이로 세그먼트 설명자를 설정하여 오버플로가 GPF를 일으키고 그 시점에서 스택 내용이 위로 이동되어 확장됩니다. 아무도 실제로 이것을 구현하는 경우 확실하지! –

관련 문제