首页 / 网页编程 / ASP.NET / ASP.NET崩溃-SiteMap中疯狂的循环
ASP.NET崩溃-SiteMap中疯狂的循环2011-02-08Tess一天,我收到了一封有关我的博客的邮件,提出如下问题,简述如下:我想快速地创建一个站点地图,因此我重写了BuildSiteMap()方法,在里面我写了一个循环,用以添加一些仿造的sitemap节点。public override SiteMapNode BuildSiteMap(){
for (int i = 0; i < 5; i++)
myRoot.ChildNodes.Add(new SiteMapNode(this, i.ToString(), i.ToString(), i.ToString()));
return myRoot;
}运行程序,就发生堆栈溢出,服务器也崩溃了。我用调试器单步调试,发现真的很奇怪:1) int i = 0
2) i < 5
3) myRoot...
4) int i = 0
5) i < 5
etc.i的值看起来从来没有增加,除非我调用到SiteMapNode(access a property, call a method),看起来这个循环是正确的。是什么使得这个循环不确定呢?咋看可能是编译器或者是CLR的一个bug.(当我获此问题时,我真不知道ASP.NET2.0中的站点导航,但我找到了这些文章... http://weblogs.asp.net/scottgu/archive/2005/11/20/431019.aspx 和http://aspnet.4guysfromrolla.com/articles/111605-1.aspx ,叙述得真是很不错.)最初的想法这个问题最重要的就是它始终重新开始, 这就意味着可以对此做现场调试。但我们暂不走那么远,先回头看看现在有什么...1. 堆栈溢出2. 一次又一次重新开始的循环我已经在先前的博客帖子里讨论过堆栈溢出,现在重复一下... 引起堆栈溢出的原因是, 分配了太多的函数指针,变量指针和参数,以致在堆栈里申请的内存数量不够用。到目前为止,堆栈溢出最平常的原因是无终止的递归。换句话说,function A调用了function B, function B又调用了function A...因此,callstack看上去有点像这样.......
functionB()
functionA()
functionB()
functionA()好了,一切都好极了,但那仅仅解释了堆栈溢出。那么疯狂的循环是怎么回事呢?好...想象一下有这样一个函数(在-->处有有一个断点)void MyRecursiveFunction(){
for(int i=0; i<5; i++){
--> MyRecursiveFunction();
}
}当你第一次停在断点处,i的值应该是0,callstack看起来是这样的...MyRecursiveFunction()...