最近遇到一个问题,服务发版后,过几分钟就会挂掉,按照我以往的经验分析可能是CPU达到100%或内存不足,但是我查看了服务的状态,CPU和内存都还很充裕。此时我晕了…,通过分析dump文件,才知道是因为StackOverflowException导致服务挂掉了。
那问题来了:
1:是什么导致了StackOverflowException。
2:为什么StackOverflowException导致服务挂掉了。
一.问题1:是什么导致了StackOverflowException
看代码,如下图所示:
1:通过pIds的个数控制循环次数
2:循环回调本函数
3:出现StackOverflowException是因为代码漏洞,虽然在循环调用函数,但是pIds并没有增加,因此没有阻止死循环,导致堆栈持续增加,直到堆栈溢出。
二.问题2:为什么StackOverflowException导致服务挂掉
1:原因是CLR认为本机代码抛出的一些异常是损坏状态异常(corrupted state exeption,CSE),因为它们一般是由CLR自身的bug造成,或者由托管开发人员无法控制的本机代码的bug造成。CLR默认不让托管代码捕捉这些异常,而将自己挂掉。
2&#x