问题描述
我的 VB.NET DLL 出现堆栈溢出异常。
调用堆栈有 115 个调用深度,它不是一个有缺陷的递归程序,但真正需要调用堆栈的深度。
当我想象递归程序比这更深入时,我想知道为什么它会爆炸。有谁知道是什么导致了堆栈空间被用完?例如在其中一个调用中作为参数的长字符串是否有贡献??否则还有什么原因会导致它?
我已经尝试了以下
代码目前是单线程的,编译为 64 位进程。
我已经有一年没有升级 VS 了,所以不确定是什么原因导致了这种情况
我知道如何通过在不同线程上启动进程的一部分然后等待它们来解决这个问题,但是这个解决方案让我担心,因为它更像是一种解决方法/黑客,而不是首先找出导致它的原因。
因此希望了解可能导致错误的可能因素,并思考可能导致堆栈空间如此快速填满的原因。
我确信如果在 C# 中迁移,程序会继续出错,所以我也用 C# 标记,因为该错误在该语言中发生的可能性相同。
解决方法
深度将受到方法中发生的事情的影响。我创建了这个示例,它根据编译器变量 foo 获取不同的计数。当 foo 为 true 时,计数为 2799,false 时计数为 5364。我必须调整 #if 的位置才能看到计数。
Private Sub Button1_Click(sender As Object,e As EventArgs) Handles Button1.Click
test()
End Sub
Dim count As Integer = 0
#Const foo = True
Private Sub test()
Try
count = count
count += 1
Dim xe As XElement = <breakfast_menu></breakfast_menu>
xe.Add(<food>
<name>Belgian Waffles</name>
<price>$5.95</price>
<calories>650</calories>
</food>)
xe.Add(<food>
<name>Strawberry Belgian Waffles</name>
<price>$7.95</price>
<calories>900</calories>
</food>)
#If foo Then
xe.Add(<food>
<name>Berry-Berry Belgian Waffles</name>
<price>$8.95</price>
<calories>900</calories>
</food>)
xe.Add(<food>
<name>French Toast</name>
<price>$4.50</price>
<calories>600</calories>
</food>)
xe.Add(<food>
<name>Homestyle Breakfast</name>
<price>$6.95</price>
<calories>950</calories>
</food>)
Dim ie As IEnumerable(Of XElement)
ie = From el In xe.<food>
Where Integer.Parse(el.<calories>.Value) < 900
Select el
#End If
test()
Catch ex As Exception
Stop
End Try
End Sub