올바른 방법은 오버 플로우를 수정하는 것입니다,하지만 ....
당신은 자신에게 더 큰 스택을 제공 할 수 있습니다 : -
using System.Threading;
Thread T = new Thread(threadDelegate, stackSizeInBytes);
T.Start();
당신은 계산 System.Diagnostics.StackTrace FrameCount 속성을 사용할 수 있습니다 사용한 프레임과 프레임 한도에 도달하면 나름의 예외를 던지십시오.
또는, 남은 스택의 크기를 계산하고 임계 값 아래로 떨어질 때 자신의 예외를 던질 수 있습니다 -
class Program
{
static int n;
static int topOfStack;
const int stackSize = 1000000; // Default?
// The func is 76 bytes, but we need space to unwind the exception.
const int spaceRequired = 18*1024;
unsafe static void Main(string[] args)
{
int var;
topOfStack = (int)&var;
n=0;
recurse();
}
unsafe static void recurse()
{
int remaining;
remaining = stackSize - (topOfStack - (int)&remaining);
if (remaining < spaceRequired)
throw new Exception("Cheese");
n++;
recurse();
}
}
은 그냥 치즈를 잡을 수있어. ;)
게시물의 대부분이 설명 될 때 당신은 나에게 또 다른 영역 추가 할 수 없습니다
@RichardOD, 내가 버그이기 때문에 버그를 수정해야합니다. 그러나 문제는 다른 방식으로 나타날 수 있으며 처리 할 수 없게됩니다. – Toto
동의 함, 스택 오버플로는 잡히지 않아서 잡힐 수없는 심각한 오류입니다. 대신 깨진 코드를 수정하십시오. –
@ 리차드 코드 : 예 : 재귀 적 파서인데 호스트 시스템이 실제로 요구하는 것 이상의 깊이에 대한 인위적인 제한을 두지 않는다. 어떻게해야 하나? 내 druthers 있다면, 거기에 약간의 스택 공간이 남아있는 동안 해고 될 명시 적으로 잡힐 수 StackCritical 예외가있을 것입니다; 그것은 실제로 던져 질 때까지 스스로를 무력하게 할 것이고, 스택 공간의 안전한 양이 남아있을 때까지 잡힐 수 없다. – supercat