托管为WCF时的StackOverflow - 在Console应用程序中正常工作

时间:2009-10-29 17:37:34

标签: wcf iis entity-framework

我有一个使用EF的应用。为了测试我的东西,我通常在我的代码周围包装一个简单的控制台应用程序,运行,重复冲洗直到我做对了...所以当我将代码移动到IIS时,看到堆栈溢出时,我感到非常惊讶。

现在我在IIS 7.5(来自MSDN的Windows 7)上遇到此问题。我有“gig”的内存免费,但代码似乎并不需要“那么多”内存,就像我说的那样 - 控制台应用运行得很好。

所以我不是IIS向导,但我想知道我是否可以手动增加堆栈大小或者使用内存w3wp等等(现在它不到200 M)。

1 个答案:

答案 0 :(得分:2)

当堆栈大小达到定义的限制并且不能在堆栈上放置更多元素时,会发生堆栈溢出。 Windows中的默认堆栈大小通常为1 MB,与进程可用的总内存无关(因此查看w3wp.exe使用的内存在您的情况下没有多大意义)。

可以增加可执行文件的堆栈大小。从Visual Studio命令提示符,您可以发出

editbin /STACK:4000000 w3wp.exe

将堆栈大小增加到4 MB。

但是,也可能是堆栈溢出是由代码中的问题引起的(通常是无限递归),这只会在作为WCF服务托管时发生。

要追踪此问题,您需要找出递归发生的位置。如果你无法获得堆栈跟踪密集型日志记录将在这里帮助你。

<强>更新

看起来,w3wp.exe不使用Window的默认堆栈大小1 MB但仅使用256 kB(另请参阅此knowledge base article):

dumpbin /HEADERS c:\windows\system32\inetsrv\w3wp.exe

打印:

[...]
OPTIONAL HEADER VALUES
[...]
    40000 size of stack reserve

blog post建议使用editbin修补w3wp.exe,如上所述。