Visual Studio 2010中調(diào)試.NET應(yīng)用程序詳解
在Visual Stuido 2010中有一個(gè)新的功能那就是IntelliTrace.IntelliTrace被引入到VisulaStudio中來(lái)加速我們對(duì).NET應(yīng)用程序的調(diào)試,它通過(guò)對(duì)預(yù)先設(shè)置的事件和方法在運(yùn)行過(guò)程中的跟蹤并將其有效地傳遞給調(diào)試執(zhí)行者,從而快速的傳遞程序在執(zhí)行過(guò)程中的狀態(tài)和各種信息來(lái)幫助開(kāi)發(fā)者更好的調(diào)試程序,快速的發(fā)現(xiàn)問(wèn)題。
實(shí)際上,在Visual Studio 2010之前,Microsoft Visual Stuido已經(jīng)幫助我們很好的繼承了調(diào)試工具,比如對(duì)變量的監(jiān)控,對(duì)堆棧的查看等等,并且允許設(shè)置斷點(diǎn)進(jìn)行單步調(diào)試等。所有的這些都在很好的幫助開(kāi)發(fā)者來(lái)了解程序在不同的執(zhí)行過(guò)程中的狀態(tài)以及檢測(cè)是否按照預(yù)先實(shí)際的邏輯進(jìn)行運(yùn)轉(zhuǎn),而且更多的,我們通過(guò)斷點(diǎn)后監(jiān)測(cè)程序狀態(tài)來(lái)發(fā)現(xiàn)問(wèn)題所在。
而這樣所存在的問(wèn)題是,一些邏輯上的錯(cuò)誤可能發(fā)生在斷點(diǎn)執(zhí)行之前,而且很可能是一些無(wú)法追查。開(kāi)發(fā)者必須停止當(dāng)前的調(diào)試,重新設(shè)置斷點(diǎn)并啟動(dòng)調(diào)試,而這樣的試驗(yàn)過(guò)程往往需要很多次才能找到正確的位置來(lái)設(shè)置斷點(diǎn)。
IntelliTrace都收集哪些數(shù)據(jù)?
那么IntelliTrace帶給我們了什么?顧名思義,它智能的將一些調(diào)試信息和程序狀態(tài)自動(dòng)的跟蹤并實(shí)施的展現(xiàn)給開(kāi)發(fā)人員,從而減少了需要程序員找到適當(dāng)?shù)臄帱c(diǎn)才能跟蹤和監(jiān)控程序運(yùn)行狀態(tài)的過(guò)程。那么這些信息到底有什么用呢?IntelliTrace又到底搜集了哪些數(shù)據(jù)呢?這取決于我們通知IntelliTrace進(jìn)行收集的數(shù)據(jù)類(lèi)型和對(duì)其大小的控制,這樣IntelliTrace會(huì)按照我們期望的方式去收集部分?jǐn)?shù)據(jù)而不是所有在即時(shí)調(diào)試過(guò)程中的程序狀態(tài)信息。
Visual Studio提供給我們兩個(gè)方式來(lái)控制其搜集信息的內(nèi)容源,一個(gè)是Intelli Traceeventsonly,僅僅收集智能跟蹤事件和調(diào)試中斷的相關(guān)數(shù)據(jù);另外一個(gè)是Intelli Traceeventsand call information,這個(gè)就會(huì)收集除了IntelliTrace事件之外對(duì)一個(gè)方法調(diào)用的進(jìn)入和退出的各種數(shù)據(jù)。下邊我們來(lái)看看在Visual Studio 2010中如何設(shè)置IntelliTrace的跟蹤選項(xiàng)。
首先我們需要檢查IntelliTrace功能在Visual Stuido 2010中是打開(kāi)的。在Visual Studio 2010中選擇”Tools|Options…”打開(kāi)選項(xiàng)對(duì)話(huà)框,并選擇”IntelliTrace|General”.確保EnableIntelliTrace是被選中的。
Figure1:Visual Studio 2010 IntelliTracesettings
默認(rèn)情況下,IntelliTrace僅僅收集IntelliTrace相關(guān)的事件,這樣是為了保持所收集的數(shù)據(jù)較少,并且對(duì)于性能上的影響是最小的。而當(dāng)你選擇對(duì)方法調(diào)用的數(shù)據(jù)也進(jìn)行搜集時(shí),除了其臨時(shí)搜集的數(shù)據(jù)所占用空間的增大外,對(duì)于性能的影響也是較大的。盡管收集到的細(xì)節(jié)有所不同,但兩種方式都會(huì)收集一些共同的數(shù)據(jù)。比如,它總會(huì)在第一次啟動(dòng)收集過(guò)程時(shí)收集系統(tǒng)信息,模塊的加載和卸載事件,線(xiàn)程的起始和結(jié)束時(shí)間等。隨著模塊和線(xiàn)程的事件,可以正確的更新模塊和線(xiàn)程調(diào)試窗口的信息。另外,任何模式下,在調(diào)試斷點(diǎn)處也會(huì)對(duì)數(shù)據(jù)進(jìn)行收集,并將所收集到的基本數(shù)據(jù)類(lèi)型和對(duì)象在調(diào)試其中進(jìn)行檢查和審閱,并允許改變其值。
Figure2:IntelliTracein Visual Studio 2010
那么什么是IntelliTrace事件呢?簡(jiǎn)單的說(shuō)就是程序員在調(diào)試程序的過(guò)程中可能會(huì)感興趣的特定的點(diǎn)。例如打開(kāi)一個(gè)文件,更改注冊(cè)表信息,點(diǎn)擊表單上的某個(gè)按鈕,甚至于數(shù)據(jù)綁定等等。IntelliTrace的事件會(huì)以競(jìng)爭(zhēng)的方式來(lái)最終決定被放置的位置,但是這個(gè)位置不能是過(guò)于頻繁的被調(diào)用而可能導(dǎo)致程序性能明顯降低的地方。
當(dāng)你用Visual Studio 2010打開(kāi)一個(gè)項(xiàng)目并且啟用IntelliTrace功能時(shí),當(dāng)調(diào)試器在斷點(diǎn)停下時(shí)你會(huì)看到IntelliTrace的信息。下圖是我在設(shè)置了對(duì)文件的訪(fǎng)問(wèn)作為IntelliTrace事件時(shí)IntelliTrace搜集的數(shù)據(jù):
Figure3:對(duì)IntelliTrace事件相關(guān)數(shù)據(jù)的收集
如何去更改IntelliTrace事件呢?對(duì)于默認(rèn)的IntelliTraceevents,文件訪(fǎng)問(wèn)是不被納入的。但你可以通過(guò)對(duì)IntelliTrace的設(shè)置來(lái)改變對(duì)你感興趣的事件信息的收集,來(lái)加速你的程序調(diào)試。選擇”Tools|Options…|IntelliTrace|IntelliTraceEvents”,在右邊的列表中選擇感興趣的事件即可。
Figure4:配置IntelliTrace事件
需要注意的是,添加的事件越多,IntelliTrace需要收集的數(shù)據(jù)就會(huì)越多,提供給你的信息就越多,而且數(shù)據(jù)占用的空間也會(huì)越多。這是需要權(quán)衡的,尤其是對(duì)于特別大的項(xiàng)目,一旦你的設(shè)置過(guò)于繁瑣,可能會(huì)讓機(jī)器處于嚴(yán)重的停滯狀態(tài)。另外,在Modules選項(xiàng)中,你還可以通過(guò)多模塊的過(guò)濾來(lái)達(dá)到只收集你最關(guān)心的數(shù)據(jù)程序狀態(tài)的目的,這樣避免了IntelliTrace對(duì)所有組件的相關(guān)事件都進(jìn)行收集的情況。
Figure5:設(shè)置IntelliTrace跟蹤的模塊
IntelliTrace到底可以幫助我們做什么?在Advanced選項(xiàng)中,可以定義每次智能跟蹤的數(shù)據(jù)的存儲(chǔ)大小和位置。IntelliTrace會(huì)收集在調(diào)試過(guò)程中程序的運(yùn)行狀態(tài),這些狀態(tài)存到哪兒,以什么樣的方式存儲(chǔ)呢?答案就在Advanced選項(xiàng)。
Figure6:IntelliTrace數(shù)據(jù)的存儲(chǔ)位置和大小
首先可以選擇跟蹤的數(shù)據(jù)的存儲(chǔ)位置,默認(rèn)是存儲(chǔ)在C:\ProgramData\Microsoft Visual Studio\10.0\TraceDebugging位置并以每個(gè)跟蹤文件最大250M的方式存儲(chǔ)為.iTrace文件。位置和對(duì)于每個(gè)文件的大小都可以做調(diào)整。那么iTrace文件到底是什么呢?iTrace文件是一個(gè)可以被Visual Studio 2010所識(shí)別的文件,它記錄了本次跟蹤過(guò)程中程序執(zhí)行的時(shí)間線(xiàn),線(xiàn)程,異常,系統(tǒng)信息和相關(guān)模塊。
Figure7:IntelliTrace文件的信息
有意思的是,這和你在IntelliTrace窗口中看到的信息是一致的,并且可以隨時(shí)映射到所對(duì)應(yīng)的調(diào)試會(huì)話(huà)中。例如,在ExceptionData部分,當(dāng)我們發(fā)現(xiàn)一個(gè)異常時(shí),我們可以清楚的看到這個(gè)異常的信息以及詳細(xì)的CallStack。
Figure8:IntelliTrace對(duì)程序調(diào)試的幫助
雙擊異常,或者點(diǎn)擊異常下方的StartDegugging按鈕可以恢復(fù)此次跟蹤所對(duì)應(yīng)的調(diào)試會(huì)話(huà),并直接定位到異常位置。并且在右邊的IntelliTrace窗口中可以完整而清楚的看到此次程序運(yùn)行過(guò)程中各種事件的相關(guān)數(shù)據(jù),以此來(lái)更清楚的還原現(xiàn)場(chǎng)并幫助找出問(wèn)題。
Figure8:IntelliTrace幫助定位問(wèn)題及還原現(xiàn)場(chǎng)
至此我們終于知道了IntelliTrace不僅僅只是給我們收集了數(shù)據(jù),更是為我們將這些數(shù)據(jù)與程序狀態(tài)和各個(gè)事件相關(guān)聯(lián),快速的幫助我們定位問(wèn)題,以此來(lái)加速程序調(diào)試。其實(shí)在MicrosoftTestManager中也適用了IntelliTrace技術(shù)來(lái)幫助我們做相關(guān)測(cè)試,但這是后話(huà)。
當(dāng)設(shè)置IntelliTrace不僅跟蹤相關(guān)的事件,并且跟蹤對(duì)每個(gè)方法的訪(fǎng)問(wèn)時(shí)你可以清楚的看到整個(gè)程序在運(yùn)行過(guò)程中是如何對(duì)不同的方法及對(duì)象進(jìn)行實(shí)例化、相互調(diào)用,線(xiàn)程調(diào)度的時(shí)間線(xiàn)等等。好比描繪了一個(gè)程序的流程圖,讓你可以清楚的在各個(gè)調(diào)用間導(dǎo)航來(lái)找到你感興趣的信息。并且,隨著在CallView窗口中在不同的調(diào)用間導(dǎo)航,你可以清楚的知道每一次調(diào)用所對(duì)應(yīng)的位置(除部分不可見(jiàn)的Code外),以此來(lái)更好的了解程序流程。
Figure9:通過(guò)CallView窗口來(lái)觀察程序中的方法調(diào)用
IntelliTrace是一個(gè)幫助我們更好的調(diào)試程序,發(fā)現(xiàn)問(wèn)題并解決問(wèn)題的工具,并且還可以靈活的定義對(duì)于所感興趣的事件和數(shù)據(jù)的收集,將會(huì)在開(kāi)發(fā)過(guò)程中扮演越來(lái)越重要的角色。另外,你還可以自己定義IntelliTrace的事件呢。
【編輯推薦】