Cách đúng là để sửa chữa các lỗi tràn, nhưng ....
Bạn có thể cung cấp cho mình một chồng lớn hơn: -
using System.Threading;
Thread T = new Thread(threadDelegate, stackSizeInBytes);
T.Start();
Bạn có thể sử dụng tài sản System.Diagnostics.StackTrace FrameCount để đếm các khung bạn đã sử dụng và ném ngoại lệ của riêng bạn khi đạt đến giới hạn khung.
Hoặc, bạn có thể tính toán kích thước của đống còn lại và ném ngoại lệ riêng của bạn khi nó giảm xuống dưới một ngưỡng: -
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();
}
}
Chỉ cần bắt Cheese. ;)
Nguồn
2009-10-21 11:33:21
@RichardOD, chắc chắn tôi sửa lỗi vì đó là lỗi. Tuy nhiên vấn đề có thể xuất hiện theo một cách khác và tôi sẽ xử lý nó theo một cách khác và tôi sẽ xử lý nó – Toto
Đồng ý, tràn ngăn xếp là một lỗi nghiêm trọng không thể bị bắt vì nó * không * bị bắt. Sửa mã bị hỏng để thay thế. –
@RichardOD: Nếu muốn thiết kế ví dụ: một trình phân tích cú pháp đệ quy và không áp đặt các giới hạn nhân tạo về chiều sâu vượt quá các giới hạn thực sự được yêu cầu bởi máy chủ, làm thế nào người ta nên đi về nó? Nếu tôi có các druthers của tôi, sẽ có một ngoại lệ StackCritical mà có thể được bắt một cách rõ ràng, mà sẽ được bắn trong khi vẫn còn một chút ngăn xếp không gian còn lại; nó sẽ vô hiệu hóa chính nó cho đến khi nó đã thực sự bị ném, và sau đó có thể không bị bắt cho đến khi một số lượng an toàn của không gian ngăn xếp vẫn còn. – supercat