如何确定(或至少推测)递归方法的堆栈帧大小?

Cri*_*scu 5 .net c# clr jit stack-trace

我希望能够在异常发生之前预测适合堆栈的递归调用的数量StackOverflow。为此,我需要找出堆栈上给定方法调用的“足迹”。

有没有办法以编程方式做到这一点?我查看了System.Diagnostics.StackFrameSystem.Diagnostics.StackTrace但找不到任何相关内容。

根据经验,使用这个简单的例子,我发现足迹非常不同:

  • 32 位 vs 64 位:~22k vs ~8k 帧(不同的指针大小是否会导致 ~3x 的增加?)
  • 调试与发布:~22k 与~64k 帧(调试构建添加各种特殊模式边界检查填充 + 调试工具)
  • 非优化与优化:
    • ~22k vs ~51k 调试(预期 - 更少的调试信息)
    • ~64k vs ~51k Release(这很奇怪!也许使用了一些记忆技术?)
  • 附加调试器与未附加调试器:令人惊讶的是,这在 jitted 代码中产生了多大的不同!
    • 85k 与 258k - 发布,优化开启
    • 14k 与 64k - 调试、优化关闭

很可能不同版本的 .NET 也会产生不同的结果。

总结一下:

看到堆栈帧大小随这些参数变化如此之大,是否有一种编程方法可以在运行时确定给定方法的堆栈帧大小?

“离线”(手动)怎么样?也许至少对于直接的、发布的、非优化的构建?