많은 C/C++/Fortran 및 다른 프로그래머가 "스택 오버플로"오류를 경험했을 것입니다. 내 질문은, 우리가 모니터링하거나 프로그램이 실행되는 동안 스택의 크기를 확인할 수 있도록 도구, 프로그램 또는 간단한 코드 조각이 있나요? 스택이 누적되어 결국 오버 플로우를 일으키는 지점을 정확히 찾아내는 데 도움이 될 수 있습니다.스택 크기를 모니터링하여 스택 오버플로를 방지하는 방법은 무엇입니까?
답변
당신을 위해 해줄 프로그램이 있는지 모르겠지만 스택 포인터가있는 곳에서 (적어도 C와 C++에서는) 쉽게 확인할 수 있습니다. 변수의 메모리 위치를 살펴보십시오. 정확한 위치는 아니지만 로컬 변수가 스택에 정의되어 있기 때문에 몇 바이트 내에 있어야합니다. 정확한 가치를 원하면 어셈블리를 통해 얻을 수 있다고 생각합니다.
프로그램이 충돌 할 때 스택 추적을 보는 것이 더 쉬울 수 있습니다.
question을 (를) 보시기 바랍니다. 허용 된 답변은 Raymond Chen을 인용합니다.
분명히해야 할 경우 솔루션/도구는 플랫폼에 따라 다릅니다. 하나의 쉬운 트릭은 알려진 바이트 값 (예 : AA)으로 스택을 채우고이 값이없는 첫 번째 바이트의 위치를 모니터링하는 것입니다. 이렇게하면 현재 스택 크기가 아닌 최대 스택 크기가 사용됩니다.
동의합니다. 예를 들어 DSP/BIOS 운영 체제는 0xDEADBEEF 패턴으로 새로 할당 된 스택을 채우고이를 사용하여 스택 사용을 추적합니다. x86 프로세서의 다른 방법 (쉽게 구현되지 않고 OS에서 수행해야 함)은 스택을 별도의 세그먼트에 배치하는 것입니다. 그런 다음 OS는 할당 된 길이로 세그먼트 설명자를 설정하여 오버플로가 GPF를 일으키고 그 시점에서 스택 내용이 위로 이동되어 확장됩니다. 아무도 실제로 이것을 구현하는 경우 확실하지! –
- 1. 깊은 트리 재귀에서 스택 오버플로를 방지하는 방법
- 2. 스택 오버플로를 늘린 후 스택 오버플로
- 3. 프롤로그가 스택 오버플로를 설정합니다.
- 4. 스택 오버플로를 일으키는 재귀 함수
- 5. 최적의 스레드 스택 크기를 결정하는 방법은 무엇입니까?
- 6. 스칼라 스택 크기를 늘리는 방법은 무엇입니까?
- 7. Ruby 1.9.2에서 스택 오버플로를 디버깅하려면 어떻게해야합니까?
- 8. 운영 체제에서 스택 오버플로를 어떻게 감지합니까?
- 9. 스택 오버플로를 일으키는 Unity와의 속성 주입
- 10. 무한 재귀 호출은이 경우 스택 오버플로를 발생시켜야합니까?
- 11. 문자 스택, 문자열 스택, 정수 스택, 정수 배열 스택 등
- 12. 스택
- 13. PROLOG - 스택 구현 방법은 무엇입니까?
- 14. 스택 기록을 삭제하는 방법은 무엇입니까?
- 15. 스택 및 스택 기본 주소
- 16. 스택 복잡도
- 17. 티타늄 Android 앱의 스택 크기를 늘리는 방법
- 18. 함수 언어로 된 프로그램이 스택 오버플로를 일으킬 가능성이 더 높습니까?
- 19. 스택 오버플로를 얻는 것은 발생한 스레드에만 영향을 줍니까?
- 20. 관리되는 executable.net의 기본 스택 크기를 어떻게 변경합니까
- 21. 어떻게 파이썬 스택 크기를 늘릴 수
- 22. 기존 .NET 스레드의 스택 크기를 얻는 방법
- 23. 스택 크기를 동적으로 변경할 수 있습니까?
- 24. Xcode 4 응용 프로그램의 스택 크기를 늘리십시오.
- 25. 최대 스택 크기는 어떻게 찾습니까?
- 26. 스택 오버플로 란 무엇입니까?
- 27. "스택 정렬"이란 무엇입니까?
- 28. VHDL에서 스택/큐와 같은 데이터 구조를 구현하는 방법은 무엇입니까?
- 29. 라텍스 메모리 오버플로를 방지하는 방법
- 30. Matlab의 이중 스택 Java 스택 트레이스
그리고 가장 낮은 스택 프레임 (main())의 지역 변수 주소를 전역 적으로 액세스 가능한 변수에 저장하는 경우 "g_my_stack_base"라고하면 approx_stack_size = my_local_function_variable - g_my_stack_base를 사용하여 함수의 대략적인 스택 크기를 확인할 수 있습니다. 추악하지만 작동합니다. 포인터 연산이 바이트를 반환하도록 char * 포인터를 사용해야합니다. – tucuxi