【问题标题】:Stack overflow from native DLL called from managed application从托管应用程序调用的本机 DLL 的堆栈溢出
【发布时间】:2009-04-08 22:01:01
【问题描述】:

当我调用本机 DLL 时,我的应用程序收到了臭名昭著的 0xC00000FD(堆栈溢出)异常。这是通过 Windows CE 5(SH4 处理器)上的托管 C# 应用程序完成的。使用相同的托管应用程序为 Windows XP 编译相同的 DLL,一切正常(没有溢出)。 DLL 中的例程正在执行一些非常复杂的递归,这最终导致了溢出,但同样,它在 PC 上运行良好。

似乎我可能只需要在构建 DLL 时调整堆栈大小?我相信在使用 Visual C 编译器时,CE 和 XP 的默认堆栈大小都是 1MB(如果重要的话,我使用的是 Visual Studio 2005)。如果它们都默认为相同的大小,我不确定为什么一个会溢出而另一个不会溢出。我尝试使用 /F 编译器标志和 /STACK 链接器标志调整堆栈大小,但这似乎没有任何作用。我也不完全清楚我可以在 DLL 中指定堆栈大小,而是可执行文件必须设置它。但如果是这种情况,我将如何调整我的托管进程在调用本机 DLL 时使用的堆栈大小?

【问题讨论】:

    标签: .net c dll windows-ce


    【解决方案1】:

    这是 Windows CE 的a discussion of the memory architecture 的链接。

    最终,您几乎无法以编程方式或在编译时调整堆栈大小;操作系统将根据许多因素(包括内存可用性)对其进行更改。使用 /F 设置堆栈大小只会设置操作系统可以(并且通常会)忽略的默认值。无论如何,/F 对 .DLL 不起作用;它仅在编译可执行文件时有效。 .DLL 没有堆栈;属于线程和(最终)属于进程。

    可能是时候回到绘图板上删除您的递归了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      相关资源
      最近更新 更多