ASP.NET崩潰-SiteMap中瘋狂的迴圈

來源:互聯網
上載者:User

一天,我收到了一封有關我的部落格的郵件,提出如下問題,簡述如下:

我想快速地建立一個網站地圖,因此我重寫了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()

...

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.