我对我的一个Windows服务做了一个小小的调整,而不是我运行它得到了,
描述:由于堆栈溢出,进程终止。
所以我回到旧版本并运行它,我仍然收到stackoverflow错误。
最糟糕的部分是我调试了两个,我没有得到这个错误再次发生。如何/什么是找到导致Windows服务溢出的最佳方法?
答案 0 :(得分:7)
您可以订阅AppDomain.UnhandledException来记录异常。另一种选择是查看服务崩溃时是否生成了故障转储,并使用WinDbg来跟踪问题。您还可以configure windows生成这些转储。 WinDbg附带了可以附加到进程的脚本,以及当此进程崩溃时generate dump。
从此article:
...找到StackOverflowException并不难。如果你跑 !clrstack并找到一条200多行的callstack,你可以或多或少 确定这是你的问题。
更新:
如果使用.NET 4.0,则需要将legacyCorruptedStateExceptionsPolicy元素添加到服务配置文件中,以便在AppDomain.UnhandledException中记录异常。
答案 1 :(得分:3)
在不了解具体问题的情况下,我可以说StackOverflowException
(或其原生等价物)是由99%的无限递归引起的。检查你的代码;确保你所知道的任何递归情况都有一个正确的结束情况,并确保你没有做一些愚蠢的事情,就像你想要访问一个字段时递归调用一个访问器或mutator一样:
private int something;
public int Something
{
get
{
return Something; // return something;
}
set
{
Something = value; // something = value;
}
}