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

C# 相对较小的调用堆栈上的c/vb堆栈溢出异常,c#,vb.net,stack-overflow,C#,Vb.net,Stack Overflow,我的VB.NET DLL中出现堆栈溢出异常 调用堆栈有115个调用深度,这不是一个有缺陷的递归程序,但真正需要调用堆栈的深度 我想知道,当我想象递归程序比这更深入时,它为什么会爆炸。有人知道是什么导致堆栈空间被耗尽了吗?e、 g.作为其中一个调用中的参数的长字符串是否有助于??或者是别的什么原因导致了它 我试过以下方法 注释掉/恢复最近的更改,但仍然失败 重新启动 多次运行它,它不会在同一个地方失败,但总是在一个随机的地方 该代码目前是单线程的,编译为64位进程 我已经有一年没有升级VS了,所以

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

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

我想知道,当我想象递归程序比这更深入时,它为什么会爆炸。有人知道是什么导致堆栈空间被耗尽了吗?e、 g.作为其中一个调用中的参数的长字符串是否有助于??或者是别的什么原因导致了它

我试过以下方法

注释掉/恢复最近的更改,但仍然失败 重新启动 多次运行它,它不会在同一个地方失败,但总是在一个随机的地方 该代码目前是单线程的,编译为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

字符串是引用类型,因此它们的长度不会影响堆栈的使用。在堆栈上传递的参数将是对字符串的引用,但作为参数传递或作为局部变量使用的值类型可能会占用堆栈空间。您正在分配大型结构吗?您引入了自引用属性吗?有一些大型类,但它们会通过引用传递。其中有些函数非常大,包含很多变量,但我看不出编译器会如何使用堆栈。我认为我们没有任何自引用属性,应用程序中也没有使用结构类型。谢谢,这当然是一个线索。这意味着,即使子系统中的数据/处理不是来自参数,也会导致堆栈填充,这让我有些困惑@user2728841计算通常不会起作用,但局部变量显然会起作用,除非可以忽略它们。