亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ASP.NET 崩潰-SiteMap中瘋狂的循環

2019-11-18 16:55:14
字體:
來源:轉載
供稿:網友

原文地址:http://blogs.msdn.com/tess/archive/2006/10/10/asp.net-Crash-_2D00_-Crazy-looping-in-a-SiteMap.aspx
發布時間:Tuesday, October 10, 2006 4:10 PM
作  者:Tess      

一天,我收到了一封有關我的博客的郵件,提出如下問題,簡述如下:
 
我想快速地創建一個站點地圖,因此我重寫了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.aspxhttp://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()
...

 

現在調用MyRecrusive函數,每一次調用這個函數自己,會再一次出現 i=0(雖然我們并不真的在同一個loop里)。若調用MyRecrusive這個函數幾個來回,并用實際執行的代碼代替之,它將執行類似如下的代碼:


for(int i=0; i<5; i++){
   for(int i2=0; i2<5; i2++){
      for(int i3=0; i3<5; i3++){
         for(int i4=0; i4<5; i4++){
            for(int i5=0; i5<5; i5++){
               for(int i6=0; i6<5; i6++){
                  for(int i7=0; i7<5; i7++){
                     ...
                  }
               }
            }
         }
      }
   }
}


... 在visual studio中查看它,看起來總是運行同樣的循環,且并不改變變量i的值。暫時,你對此不會有深層次的理解,直到你真正看到堆棧調用。
假如我們看一下callstack, callstack現在看起來是這樣的...

MyRecursiveFunction()
MyRecursiveFunction()
MyRecursiveFunction()
MyRecursiveFunction()
MyRecursiveFunction()
MyRecursiveFunction()
MyRecursiveFunction()
...

因此最初想法的結論是,我們無疑地要看看某些遞歸...但在哪呢?例子中的代碼

      myRoot.ChildNodes.Add(new SiteMapNode(this, i.ToString(), i.ToString(), i.ToString()));

看起來并不是那么復雜...

在這兒最可疑的是new SiteMapNode() 和myRoot.ChildNodes.Add() ,假如我們用reflector查看一下,那么這將不再那么神秘。
 

調試問題


最后:)  少一點口舌,多來一點windbg行動...


因它易重新呈現,所以我會在我的機器上重新呈現它,我只要將windbg (File / Attach to process)附到w3wp.exe上,點擊g開始即可。然后會重新產生了這個問題,程序中止時提示我這是一個堆棧溢出(我們已經知道了)。
 
(7e4.ddc): Stack overflow - code c00000fd (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=0fa4235c ebx=02beca74 ecx=02beca74 edx=02becb54 esi=02becb54 edi=02beca74
eip=686b5cb4 esp=02163000 ebp=02163004 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00210246
System_Web_ni+0xf5cb4:686b5cb4 56 push esi

我們查看一下堆棧,使用 !clrstack命令看看是怎么中止的,但我們只能看到....


0:016> !clrstack
OS Thread Id: 0xddc (16)
ESP EIP 02163000 686b5cb4 System.Web.StaticSiteMapProvider.GetChildNodes(System.Web.SiteMapNode)

 ... 這對我們并沒有太大的幫助。有時當我們遇到堆棧溢出時,使用!clrstack 命令就會出現一些這樣的問題。因此我們還需要使用!dumpstack命令查看一下raw stack。


0:016> !dumpstack
OS Thread Id: 0xddc (16)
Current frame: (MethodDesc 0x68b03720 +0x4 System.Web.StaticSiteMapProvider.GetChildNodes(System.Web.SiteMapNode))
ChildEBP RetAddr Caller,Callee
02163004 686b1fc4 (MethodDesc 0x68aeff30 +0x18 System.Web.SiteMapNode.get_ChildNodes())
0216300c 0f765641 (MethodDesc 0xfa42328 +0x59 ViewSiteMapProvider.BuildSiteMap())
0216303c 686b5cdf (MethodDesc 0x68b03720 +0x2f System.Web.StaticSiteMapProvider.GetChildNodes(System.Web.SiteMapNode))
02163074 686b1fc4 (MethodDesc 0x68aeff30 +0x18 System.Web.SiteMapNode.get_ChildNodes())
0216307c 0f765641 (MethodDesc 0xfa42328 +0x59 ViewSiteMapProvider.BuildSiteMap())
021630ac 686b5cdf (MethodDesc 0x68b03720 +0x2f System.Web.StaticSiteMapProvider.GetChildNodes(System.Web.SiteMapNode))
021630e4 686b1fc4 (MethodDesc 0x68aeff30 +0x18 System.Web.SiteMapNode.get_ChildNodes())
021630ec 0f765641 (MethodDesc 0xfa42328 +0x59 ViewSiteMapProvider.BuildSiteMap())
0216311c 686b5cdf (MethodDesc 0x68b03720 +0x2f System.Web.StaticSiteMapProvider.GetChildNodes(System.Web.SiteMapNode))
02163154 686b1fc4 (MethodDesc 0x68aeff30 +0x18 System.Web.SiteMapNode.get_ChildNodes())
0216315c 0f765641 (MethodDesc 0xfa42328 +0x59 ViewSiteMapProvider.BuildSiteMap())
...

好了,這看起來問題出自ChildNodes屬性。使用該屬性時,會調用GetChildNodes 函數,這個函數會再次調用BuildSiteMap 函數,從而它又調用了ChildNodes 屬性,如此一直下去,導致了堆棧溢出。


結論


 在關于BuildSitemap的文檔中,你能找到如下段落:
 
BuildSiteMap 方法由 FindSiteMapNode、GetChildNodes和GetParentNode方法的默認實現調用。如果在派生類中重寫 BuildSiteMap 方法,請確保它僅加載一次站點地圖數據,并在后續調用中返回。
為了避免出現遞歸和堆棧溢出,最好避免調用該方法,像在BuildSiteMap例子里,我們可以用AddNode方法來添加子節點。
這在歸檔在Site Map Providers這篇文章中,該文同樣值得一讀。
BuildSiteMap 一般不應當調用其他的site map提供的方法或屬性,因為許多方法和屬性默認會實現BuildSiteMap調用。 例如,BuildSiteMap中的RootNode會引起遞歸,從而使之以堆棧溢出而終止。 
http://www.49028c.com/Ring1981/archive/2006/10/19/443280.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
韩国v欧美v日本v亚洲| 亚洲欧洲日产国码av系列天堂| 综合欧美国产视频二区| 国产精品三级久久久久久电影| 日本韩国欧美精品大片卡二| 亚洲国产精品国自产拍av秋霞| 国产手机视频精品| 日本精品久久中文字幕佐佐木| 国产精品日韩在线观看| 欧美最近摘花xxxx摘花| 国产一区二区三区久久精品| 精品视频在线导航| 亚洲自拍偷拍在线| 奇米4444一区二区三区| 国产v综合ⅴ日韩v欧美大片| www.国产一区| 国产suv精品一区二区三区88区| 欧美性猛交xxxx富婆弯腰| 一区二区成人精品| 欧美成人剧情片在线观看| 国产成人精品电影| 97视频免费在线看| 欧美性猛交xxxx黑人| 日韩一二三在线视频播| 亚洲国产精品中文| 日韩有码在线视频| 欧美第一淫aaasss性| 九九热精品在线| 日韩精品免费视频| 久久久久久久999精品视频| 精品无人区太爽高潮在线播放| 欧美日韩一区免费| 成人国内精品久久久久一区| 亚洲免费电影一区| 欧美国产日韩一区二区三区| 久久亚洲国产精品| 91网站免费观看| 欧美交受高潮1| 欧美性生交大片免费| 欧美成人午夜免费视在线看片| 另类专区欧美制服同性| 永久免费精品影视网站| 国产精品永久免费在线| 欧美在线观看网站| 久久99久国产精品黄毛片入口| 日韩国产精品视频| 日本一区二三区好的精华液| 精品精品国产国产自在线| 欧美日韩一区二区三区| 欧美插天视频在线播放| 亚洲免费人成在线视频观看| 国产精品第一区| 成人免费福利在线| 久久99久久久久久久噜噜| 亚洲最大的av网站| 国产狼人综合免费视频| 色琪琪综合男人的天堂aⅴ视频| 欧美电影免费观看电视剧大全| 色悠悠久久88| 日韩中文字幕在线视频| 在线成人免费网站| 久久这里只有精品99| 欧美激情免费看| 国产精品高精视频免费| 日韩成人激情影院| 久久影视三级福利片| 国内精品久久久久久| 欧美久久精品午夜青青大伊人| 亚洲色图校园春色| 亚洲视频在线观看免费| 亚洲欧洲日本专区| 国产综合视频在线观看| 日韩黄色av网站| 欧美激情xxxxx| 欧美在线免费看| 亚洲一区二区三区香蕉| 国产亚洲欧美日韩精品| 久久精品视频99| 性色av一区二区三区红粉影视| 久久视频免费在线播放| 国产精品视频26uuu| 亚洲小视频在线| 91精品视频免费| 亚洲欧美日韩一区二区在线| 欧美极品少妇xxxxx| 九九热视频这里只有精品| 国产手机视频精品| 亚洲综合在线播放| 最新69国产成人精品视频免费| 久久韩剧网电视剧| 欧美制服第一页| 91精品久久久久久久久久久| 亚洲自拍偷拍福利| 亚洲区免费影片| 国产精品电影久久久久电影网| 国产日韩在线看| 日韩av在线影视| 日韩在线观看av| 国内精品久久久久久中文字幕| 欧洲精品毛片网站| 国产精品国语对白| 乱亲女秽乱长久久久| 在线午夜精品自拍| 久久中文字幕视频| 久久久久久有精品国产| 久久亚洲国产成人| 欧美性69xxxx肥| 国产一区二区三区在线播放免费观看| 亚洲美腿欧美激情另类| 中文字幕无线精品亚洲乱码一区| 亚洲大胆人体视频| 成人av番号网| 丝袜亚洲欧美日韩综合| 欧美成人精品一区二区| 亚洲国内高清视频| 久久久久久久久久婷婷| 久久精品国产一区二区三区| 久久久久久久久久国产| 2019中文字幕在线免费观看| 亚洲欧洲第一视频| 欧美激情综合亚洲一二区| 国产精品a久久久久久| 欧美中文在线免费| 国产成人亚洲综合青青| 欧美日韩国产在线播放| 成人黄色免费网站在线观看| 91精品国产高清| 日产日韩在线亚洲欧美| 国产精品欧美一区二区三区奶水| 亚洲欧美国产日韩中文字幕| 欧美激情视频播放| 91精品久久久久久久久青青| www.xxxx精品| 亚洲午夜未满十八勿入免费观看全集| 国产日韩欧美日韩大片| 国内免费精品永久在线视频| 亚洲日本欧美日韩高观看| 日韩美女激情视频| 日韩在线视频线视频免费网站| 伊人久久免费视频| 欧美一区深夜视频| 自拍偷拍免费精品| 亚洲精品电影在线观看| 国产精品18久久久久久首页狼| 日韩中文字幕在线免费观看| 最近2019好看的中文字幕免费| 久久久精品国产亚洲| 日韩中文字幕久久| 日韩免费精品视频| 中文字幕欧美精品在线| 综合136福利视频在线| 亚洲大尺度美女在线| 欧美高清电影在线看| 久久精品国产久精国产一老狼| 欧美在线免费观看| 日韩成人性视频| 日本久久久久久久久| 欧美猛交ⅹxxx乱大交视频| 亚洲国产精品小视频| 亚洲片在线资源| 国产免费一区二区三区在线能观看| 成人激情综合网| 国产精品一久久香蕉国产线看观看| 欧美激情一级欧美精品|