gpt4 book ai didi

c# - 如何在捕获 StackOverflowException 之前检测和记录错误

转载 作者:行者123 更新时间:2023-11-30 22:08:43 25 4
gpt4 key购买 nike

我的服务器有一个 StackOverflowException。它有超过 20,000 行代码,我找不到它被抛出的位置......因为 try/catch 不工作我无法得到错误......有什么方法可以得到错误日志? UnhandledExceptionEventHandler 没有记录它,所以...我如何检测它并在它使我的服务器崩溃之前记录错误?你也可以建议我如何找到 StackOverflowException :)

我使用的是 .NET Framework 4.5

UnhandledExceptionEventHandler代码:

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(Program.UnhandledExceptionEventArgs);
private static void UnhandledExceptionEventArgs(object sender, UnhandledExceptionEventArgs e)
{
Exception ex = (Exception)e.ExceptionObject;
Console.WriteLine(ex.ToString());
}

图片:

Error message

最佳答案

一般来说,你不能。 StackOverflowException是您无法捕获的少数异常之一。

如果异常发生在您自己的代码中,最好的解决方案是将您的算法从递归调用转换为使用堆分配的算法 Stack<T>跟踪深度状态,这还允许您捕获堆栈容量超过阈值的情况 ( if( stack.Count >= 4000 ) break;

enum Result {
Found,
NotFound,
Aborted
}

public static Result DepthFirstSearch(Node node) {

Stack<Node> stack = new Stack<Node>();
stack.Push( node );

while( stack.Count > 0 ) {

Node n = stack.Pop();
if( IsNodeWeWant( n ) ) return Result.Found;

foreach(Node child in n.Children) stack.Push( child );

if( stack.Count >= 4000 ) return Result.Aborted;

}
return Result.NotFound;
}

如果您觉得必须使用递归调用,则向您的方法添加一个额外的整数参数,称为“深度”(每次递归调用都会增加)。然后,在您的函数中,您可以检查自己的深度并在出现堆栈溢出之前中断。

例子:

enum Result {
Found,
NotFound,
Aborted
}

public static Result DepthFirstSearch(Node node, Int32 depth) {

if( depth >= 4000 ) return Result.Aborted;

if( IsNodeWeWant( node ) ) return Result.Found;

foreach(Node child in node.Children) {
Result result = DepthFirstSearch( child, depth + 1 );
if( result != Result.NotFound ) return result; // return Found or Aborted
}
}

但是,如果异常发生在您的代码之外(并且您无法在输入之前验证数据以中止操作),那么您唯一的选择是创建一个托管错误代码的子进程。您可以使用某种形式的 IPC 或共享内存进行通信(尽管您不能直接共享 POCO,至少在没有序列化的情况下不能)。

关于c# - 如何在捕获 StackOverflowException 之前检测和记录错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22082794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com