c#/vb 堆栈溢出异常相对较小的调用堆栈

时间:2021-02-24 14:15:07

标签: c# vb.net stack-overflow

我的 VB.NET DLL 出现堆栈溢出异常。

调用堆栈有 115 个调用深度,它不是一个有缺陷的递归程序,但真正需要调用堆栈的深度。

当我想象递归程序比这更深入时,我想知道为什么它会爆炸。有谁知道是什么导致了堆栈空间被用完?例如在其中一个调用中作为参数的长字符串是否有贡献??否则还有什么原因会导致它?

我已经尝试了以下

  • 注释掉/恢复最近的更改,但仍然失败
  • 重启
  • 多次运行,它永远不会在同一个地方失败,但总是在一个随机的地方

代码目前是单线程的,编译为 64 位进程。

我已经有一年没有升级 VS 了,所以不确定是什么原因导致了这种情况

我知道如何通过在不同线程上启动进程的一部分然后等待它们来解决这个问题,但是这个解决方案让我担心,因为它更像是一种解决方法/黑客,而不是首先找出导致它的原因。

因此希望了解可能导致错误的可能因素,并思考可能导致堆栈空间如此快速填满的原因。

我确信如果在 C# 中迁移,程序会继续出错,所以我也用 C# 标记,因为该错误在该语言中发生的可能性相同。

1 个答案:

答案 0 :(得分:1)

深度将受到方法中发生的事情的影响。我创建了这个示例,它根据编译器变量 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
相关问题