我遇到了一种情况,根据小型转储,某些文件导致递归下降解析器中的堆栈溢出。不幸的是,我无法获得一个这样做的文件示例以重现问题(客户有保密问题),这让我目前在诊断真正的问题时有点手足无措。
显然解析器需要一些关注,但现在我的首要任务是保持程序运行。作为权宜之计,我能做些什么来防止这导致整个程序崩溃?
我的第一选择是找到某种方法来预测我的堆栈空间不足,这样我就可以在溢出发生之前优雅地中止解析器。无法解析文件是可接受的选项。第二种选择是让它发生,捕获错误并记录它,然后继续处理其余数据。
解析是在Parallel.ForEach()
循环中发生的。如果有帮助,我愿意将其换成其他方法。
编辑: 如果我能得到当前线程堆栈的大小和堆栈指针的位置,那将是真正的杀手。这可能吗?
编辑 2: 我终于设法从某人身上提取了一个示例文件,并在调试器中捕获了错误。事实证明,它根本不是属于我们的代码——异常发生在HtmlAgilityPack的某个地方。所以看起来我将不得不尝试找到一个完全不同的策略。