Visual Studio在StackOverflowException中丢失了第一个堆栈帧

4
我正在运行一个网络爬虫,并使用HtmlAgilityPack解析页面内容,但在这个C#库中随机出现StackOverflowException异常。当我尝试查看调用堆栈列表时,我得到以下信息:“已超过Visual Studio支持的最大堆栈帧数。”附注:我已经使用sjdirect's的HAP修复程序。下面是一张截图(所有信息都重复出现)。

有没有办法扩大Visual Studio可以跟踪的堆栈帧数,至少与应用程序在填充其堆栈之前分配的数量相同?或者可以反过来做,即减少正在调试的应用程序的堆栈大小吗?

这是一个快照(一直重复到这里)。 - clausavram
谢谢您提供快照。我希望它有助于澄清问题。 - clausavram
2个回答

1
StackOverflowExceptions的问题在于它们太深了,以至于堆栈实际上被破坏了。 这个页面 有一个递归示例,会导致此条件,最终在堆栈上达到80,000级。
考虑到VS上一次我读到的仍然是一个32位应用程序,模拟64位进行调试,你可能已经超出了VS可管理的堆栈级别数量的可用内存。

好的,那么我可以减少调试应用程序分配的堆栈空间吗? - clausavram
我不这样认为,因为这取决于你正在调试的应用程序所允许的内存分配。 - Martin Noreke
尝试更改应用程序代码以减少递归以避免问题可能是更好的操作方法。 - Martin Noreke
1
这是我计划做的事情,一个好的方法是通过检查生成SOE的数据来进行,因为我还没有找到行为模式。 - clausavram
我会尝试以类似的方式配置.NET虚拟机,就像使用“-Xss”可以配置JVM一样。 - clausavram

1

没有明显的功能可以限制CLR应用程序的堆栈大小或增加Visual Studio跟踪的堆栈帧数。

作为解决方案,我将放弃使用HtmlAgilityPack来提取文本(诸如this之类的内容并不是真正的解决方案),并编写一个老式的HTML到文本解析器,或者尝试StackOverflow上发布的其他类似问题的答案之一(非常类似于Matt Crouch的问题,尽管没有一个答案适合从成千上万的页面中提取可呈现文本)

编辑:虽然通常不建议使用正则表达式,但这实际上解决了我的问题(而无需处理StackOverflowException):将HTML转换为纯文本

感谢您的努力,希望这能帮助其他人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接