Nếu tôi viết những dòng này:Tại sao .NET không ghi nhật ký ngăn xếp cho các ngoại lệ StackOverflow?
class Program
{
static void Main(string[] args)
{
throw new Exception("lol");
}
}
và chạy exe từ dòng lệnh, tôi nhận được hai mục trong bản ghi sự kiện của tôi. Một là một lỗi ứng dụng cho biết có một ngoại lệ chưa được xử lý, và phần còn lại chứa dấu vết stack với nguồn như .NET Runtime.
Nếu tôi viết những dòng này:
class Program
{
static void Main(string[] args)
{
Recurse4Evr();
}
static void Recurse4Evr()
{
Recurse4Evr();
}
}
tôi chỉ nhận được một mục trong bản ghi sự kiện của tôi, mà nói Lỗi Ứng dụng và rằng có một ngoại lệ stack overflow. Không có mục nhập thứ hai với dấu vết ngăn xếp, do đó, nó về cơ bản vô dụng.
Tại sao dấu vết ngăn xếp cũng không được ghi lại? Nếu tôi thiết lập DebugDiag và đính kèm nó vào quá trình của tôi và sau đó có một tràn ngăn xếp, DebugDiag có thể đăng nhập theo dõi ngăn xếp. Rõ ràng là dấu vết ngăn xếp có sẵn cho thế giới bên ngoài theo một cách nào đó. Nếu thời gian chạy là chấm dứt quá trình bởi vì nó phát hiện một stackoverflow, sau đó nó cũng biết những gì ngăn xếp được.
Trong các ứng dụng lớn có nhiều tương tác phức tạp, thường không thể tạo lại các điều kiện dẫn đến tràn ngăn xếp. Trong tình huống này, một dấu vết ngăn xếp là cách duy nhất để tìm ra những gì đã xảy ra. Tại sao microsoft quyết định không quan trọng để đăng nhập thông tin này? Có một quyết định thiết kế hợp pháp nào không rõ ràng không?
Dự đoán của tôi là tạo ra ngăn xếp theo dõi trong quá trình yêu cầu các cuộc gọi chức năng, không thể hoạt động vì ngăn xếp tràn. Trình gỡ lỗi nhận được xung quanh điều này bằng cách có thể đi bộ ngăn xếp bằng cách sử dụng cấu trúc dữ liệu của riêng mình và (hy vọng) ngăn xếp lành mạnh. – siride
Đây là một câu hỏi tuyệt vời! Tôi tự hỏi nếu nó đã làm với cách tràn ngăn xếp được phát hiện ... Sau. Net 2.0, nó có vẻ như là mặc dù bạn cũng không thể bắt nó, hoặc, vì vậy nó có vẻ như là mặc dù nó chơi bởi một bộ đặc biệt của các quy tắc. –
bản sao có thể có của [C# bắt ngoại lệ tràn ngăn xếp] (http://stackoverflow.com/questions/1599219/c-catch-a-stack-overflow-exception) – balexandre