VS2008調(diào)試技巧收集備用.doc_第1頁
VS2008調(diào)試技巧收集備用.doc_第2頁
VS2008調(diào)試技巧收集備用.doc_第3頁
VS2008調(diào)試技巧收集備用.doc_第4頁
VS2008調(diào)試技巧收集備用.doc_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、5;,什么都寫在一行,你怎么在VS2008 調(diào)試技巧收集備用VS2005 調(diào)試技巧集合spx 下面有從淺入深的6 個問題 ,您可以嘗試回答一下一個如下的語句for (int i = 0; i < 10; i+)if (i = 5)j =j=5 前面插入斷點在一個 1000 次的循環(huán)體內(nèi)部設(shè)置斷點,你希望當循環(huán)進行到900 次后中斷 ,怎么才能做到呢?你有一個表達式在上面循環(huán)的某一次發(fā)生了變化,你想知道是哪一次,在哪個地方,怎么才能做到?你希望你的斷點在被命中 100 次后,每命中三次中斷一次,比如第 103 ,第 106 ,第 109 怎樣做?你有在調(diào)試一個服務程序, 希望在其內(nèi)部打上了

2、斷點, 可是,由于這是一個公用的服務你不希望其他訪問這個服務的程序被你的調(diào)試所干擾,你想怎么辦?怎樣知道 2 個斷點中斷的時間間隔問題 1,2一個如下的語句for (int i = 0; i < 10; i+)if (i = 5)j =5;,什么都寫在一行,你怎么在j=5 前面插入斷點在一個 1000 次的循環(huán)體內(nèi)部設(shè)置斷點,你希望當循環(huán)進行到900 次后中斷 ,怎么才能做到呢?這兩個問題最簡單,我在一個例子里說明例如如下循環(huán)for(inti=0;i<1000;i+)doSomeThing.在循環(huán)的大括號上單擊右鍵,插入斷點,用這個方法,可以對付那些喜歡把語句寫在一行上的家伙,其實

3、,隨著.Net3.5 中 Linq 的出現(xiàn),我們肯定也會經(jīng)常在在一行上寫復雜的表達式,這個時候用這種插入方法會比較管用ok ,現(xiàn)在我們來編輯這個斷點的條件,在斷點上右鍵單擊,選擇如圖菜單項在彈出的窗口中可以設(shè)置斷點命中的條件i=900注意我是在調(diào)試C# 代碼,默認的條件語句語法是C# ,如果你想切換,那就需要用Ctrl-B,來插入斷點,并在彈出窗口中選擇語言通過這樣設(shè)置條件斷點,我們就可以解決我們的問題1,2 了問題 3你有一個表達式在上面循環(huán)的某一次發(fā)生了變化,你想知道是哪一次,在哪個地方,怎么才能做到?同樣通過設(shè)置條件斷點我們還可以解決我們的問題 3, 對表達式變化的跟蹤string us

4、er=yizhu2000for(int i=0;i<10000;i+)DoSomething1().DoSomethingN()當循環(huán)執(zhí)行完畢時我們發(fā)現(xiàn)user 變成了 smart_boy, 你不知道這個值是在第幾次循環(huán)的時候變化的,那么你是不是會選擇打上斷點,一次一次中斷 ,來查看呢 ?當然不用在循環(huán)體結(jié)束的位置我們設(shè)置一個斷點,打開條件編輯窗口(打開方法同上 ),設(shè)置表達式為user, 勾選下面的HasChanged, 也就是說 ,你告訴斷點 ,當user 的值發(fā)生變化時才觸發(fā)(注意 :第一次執(zhí)行到斷點的時候,程序一定會中斷,并計算這時表達式的值 ,所以 ,所謂發(fā)生變化,指的是以后執(zhí)

5、行到斷點是表達式的值和第一次執(zhí)行到斷點時表達式的值的比較 )問題 4你希望你的斷點在被命中 100 次后,每命中三次中斷一次,比如第 103 ,第 106 ,第 109 怎樣做?如何讓斷點在指定的命中次數(shù)或者大于某個次數(shù)時觸發(fā)呢 ?方法是設(shè)定幾個斷點的HitCount, 右鍵單擊斷點 ,在彈出菜單中選擇Hit Count, 會彈出如下窗口在when the break point ishit 下拉列表里 ,我們可以看到四個選項break always: 總是中斷break when the hit count is equalto: 等于某次數(shù)時中斷beak when the hit coun

6、t is a multpileof: 當次數(shù)是某數(shù)的倍數(shù)時中斷break when the hit count is greater than orequal to: 當大于等于某數(shù)時中斷問題 5你有在調(diào)試一個服務程序, 希望在其內(nèi)部打上了斷點, 可是,由于這是一個公用的服務你不希望其他訪問這個服務的程序被你的調(diào)試所干擾,你想怎么辦?前面 4 個問題都已經(jīng)解決了 ,第 5 個問題的解決方法是利用斷點的 Filter 功能 ,比如我希望斷點只有被機器名為 yizhu 的機器訪問才能觸發(fā) ,我可以這樣設(shè)置當其他機器訪問程序的時候,斷點將不會觸發(fā),這樣做的優(yōu)點是通過設(shè)置機器名,我們可以讓其他機器訪問

7、的時候感覺不到斷點的存在,除此之外我們可以設(shè)置機器名 ,進程號 ,進程名 ,線程號 ,線程名作為filter, 而且還可以把他們組合起來,比如我希望通過當機器yizhu 的進程調(diào)用時才觸發(fā),那么問題就可以設(shè)置為dllhostMachineName=yizhu&ProcessName=dllhost問題 6怎樣知道 2 個斷點中斷的時間間隔現(xiàn)在我們來解決第6個問題:在程序性能調(diào)試的時候,我們經(jīng)常需要知道某段代碼的執(zhí)行效率 ,一般來說 ,我們可以在程序中加入時間點 ,通過時間點相減來取得時間間隔,這種方法有個顯而易見的缺點就是需要修改程序,想要不修改程序,就需要借助一些工具 ,那么有沒有什

8、么方法可以聲明式的插入時間點,并計算值呢 ?其實斷點完全可以做到在給出方法前 ,我們來看看斷點的另外一個設(shè)置項,When Hit,這個選項可以讓我們在命中斷點后做一些事情,包括輸出一些內(nèi)容 ,或者調(diào)用宏 ,比如輸出一個程序中變量的值我們輸出了變量user 的值,下面ContinueExecution 表示程序不會中斷 ,輸出后繼續(xù)執(zhí)行 ,注意表達式需要用 括起來 ,,其他的部分會被作為字符串輸出。設(shè)定 WhenHit 后斷點變成了方形(看厭了圓斷點 ,我還挺喜歡這個方家伙的)在 output 中查看輸出結(jié)果,如下 :既然可以計算表達式,我們的第一個最簡方案就出來了,也就是在程序執(zhí)行到斷點的時候

9、 ,輸出 DateTime.Now, 這樣當然是可行的 ,但是我們需要的是時間間隔,所以我們還需要自己來算個減法,還是挺麻煩的 ,怎么樣才能讓程序自己輸出時間間隔呢?有一個想法是這樣的 ,我們在上一個斷點聲明一個時間變量 ,然后在下面的斷點里用DataTime.Now減去這個變量 ,即斷點一的條件 :DateTime _t=DateTime.Now; 斷點二的條件 :DateTime.Now-t;看起來不錯 ,但是實際運行時就有問題了,讓我們看看輸出吧上面高亮的部分說 ,變量申明只能在 immediate window 中進行 ,所以斷點一的變量沒有申明成功 ,關(guān)于 immediatewind

10、ow, 我們以后會涉獵到 ,反正就是說想在表達式里申明變量 ,沒門 ,死路一條 .那么我們怎么才能不申明變量又時間點呢?這時我想起了Thread.SetData方法 ,這個方法可以往當前線程專門提供的空間中插入一些數(shù)據(jù) ,并且可以通過GetData 得到數(shù)據(jù) ,具體細節(jié)參考thread.setdata(VS.80).aspx于是方案就有了,在第一個斷點處把時間放入Thread 的DataSlot, 然后第二個斷點取出來相減斷點一的條件 :Thread.SetData(Thread.GetNamedDataSlot(ExecutionTime),DateTime.Now);斷點二的條件 :Dat

11、eTime.Now-(DateTime)System.Threading.Thread.GetData(System.Threading.Thread.GetNamedDataSlot(ExecutionTime);看看輸出效果我們的目的已經(jīng)達到了 ,output 中成功的輸出了時間間隔 ,當然,還不是很完善 ,首先 ,這個方法限于兩個斷點 ,你想多打幾個斷點 ,測試兩兩間的間隔還是比較麻煩 .測量精度也可以提高 ,大家有興趣可以自己研究這個方法的擴展=高效編程十八式 ( 11/13 )調(diào)試調(diào)試王偉冰調(diào)試可以深入程序內(nèi)部,觀察運行時各個變量的值。但是,并不是一出現(xiàn) bug 就要調(diào)試。 調(diào)試最適

12、合用來探究一些自己不太熟悉的語言特性或者是技術(shù)。比如你對C+ 某些語句的作用不太熟悉,對某個庫函數(shù)的作用不太熟悉,調(diào)試一下,就可以看得清清楚楚了。如果程序只是邏輯出錯誤,最好的方法是測試,通過逐個單元的測試,找出問題的所在。為什么測試的效率更高?因為測試可以是自動化的,你可以編寫測試代碼,一次性地完成很多測試,但調(diào)試只能一步一步地來。調(diào)試的好處是可以直接看變量的值,而測試的話,必須寫額外的代碼把變量的值輸出到控制臺或者日志文件里。下面說一些調(diào)試的技巧。斷點最簡單的一種,設(shè)置一個斷點,程序執(zhí)行到那一句就自動中斷進入調(diào)試狀態(tài)。單步執(zhí)行有三種,一種是每次執(zhí)行一行;一種是每次執(zhí)行一行,但遇到函數(shù)調(diào)用就

13、會跳到被調(diào)用的函數(shù)里;一種是直接執(zhí)行當前函數(shù)里剩下的指令,返回上一級函數(shù)。在VisualStudio 中,上面三種方法對應的快捷鍵分別為F10 、 F11 、Shift+F11 。監(jiān)視調(diào)試器可能會自動列出一些相關(guān)變量的值,但是你可能還關(guān)心其它變量的值,可以添加對這些變量的監(jiān)視。還可以監(jiān)視一個表達式的值,比如 a+b 。但是,這個表達式最好不要修改變量的值,比如監(jiān)視 a+ 都會導致監(jiān)視時修改了 a 的值,影響了程序的運行結(jié)果。條件中斷假如你有這樣的循環(huán):for(inti=0;i<100;i+)for(int j=0;j<100;j+)你懷疑當 i=10 且 j=10 的時候執(zhí)行有問題

14、,那如何調(diào)試?用斷點的話,從 i=0 的初始狀態(tài), 需要中斷10 次才能到i=10 ,然后從 j=0 也需要再中斷10 次,才能到j(luò)=10 的狀態(tài)。所以想進入i=10 且 j=10 的狀態(tài),需要中斷20 次,這太麻煩了。可以使用條件中斷:for(inti=0;i<100;i+)for(int j=0;j<100;j+)if(i=10 && j=10); / 空語句在空語句的那一行設(shè)置斷點就可以了。上面的 if 結(jié)構(gòu)太占地方,還可以用assert :assert(i!=10 | j!=10);斷言 i 不為 10 或 j 不為 10 ,那么當 i=10 且 j=10

15、的時候, 斷言就不成立,程序就會中斷,進入調(diào)試狀態(tài)。有時候用 throw 也可以中斷:if(i=10&& j=10)throw;但是最好不要這樣做, 調(diào)試器不一定會在throw 的地方中斷??刂谱兞糠ㄆ鋵嵾@已經(jīng)不算是調(diào)試的內(nèi)容了, 但是也是一種找出 bug 原因的手段,所以還是在這里說??刂谱兞糠ǔS糜诳茖W研究中,比如說,研究牛頓第二定律a=F/m,a 與 F 和 m 都有關(guān),那么可以先固定m ,研究a 與F 的關(guān)系;然后固定F,研究m 與a 的關(guān)系。對于一個程序來說,一個 bug 可能跟多處代碼有關(guān)。假如你懷疑這個 bug 與某些語句有關(guān),可以把這些語句注釋掉,或者是改一改,

16、看看 bug 是否還存在,如果不存在,說明確實跟這些語句有關(guān)。 (當然,要保證程序少了這些語句之后還可以順利運行。 )如果 bug 還存在,就說明它跟這些語句無關(guān)。有些時候我們?nèi)狈φ{(diào)試工具,比如在網(wǎng)頁上運行的程序,在特殊設(shè)備上運行的程序,那么控制變量法是一種很有用的代替手段。二分法二分法是控制變量法的進一步擴展。在數(shù)學上,二分法用于求一個連續(xù)函數(shù)的根。比如一個函數(shù) f(x) ,如果 f(x1)>0 且 f(x2)<0 ,那么在區(qū)間x1 和 x2 之間,必定存在一個x,使 f(x)=0 。然后我們再考察區(qū)間的中點x3=(x1+x2)/2 ,如果 f(x3)>0 ,則函數(shù)的根就在

17、區(qū)間x3 和 x2 之間,如果f(x3)<0 ,那么函數(shù)的根就在區(qū)間 x1 和 x3 之間。如此不斷地把區(qū)間一分為二,最后鎖定函數(shù)的根。對于一個程序來說,如果當前情況是有bug 的,那就好比是f(x1)>0 ;如果你把main 函數(shù)里所有的操作都注釋掉,那么程序什么都不做,就不可能有bug ,那就好比是f(x2)<0 ;于是在這兩種狀態(tài)之中,肯定存在一些臨界的語句,當這些語句改動的時候, 就會使程序在有 bug 和無 bug 狀態(tài)間切換, 這些語句就是 bug 的原因所在。 運用二分法的思想可以鎖定這些臨界語句。一開始先對程序做一些大刀闊斧的改動,比如說,程序的主循環(huán)會循環(huán)1

18、0 次,就改成 1 次;程序有 10 個功能,就關(guān)掉 5 個功能??纯茨男└膭?,可以讓程序由有 bug 狀態(tài)切換到無bug 狀態(tài)。找到這樣改動后,就把這個改動再細分成幾個小改動,比如關(guān)掉 5 個功能,就細分為關(guān)掉一兩個功能,再看看哪些小改動可以讓程序由有 bug 狀態(tài)切換到無 bug 狀態(tài)。如此一步一步縮小包圍圈,就后鎖定一個無法再分的小改動,這個改動就是bug 的原因所在。同步法有些 bug 是由于多線程而產(chǎn)生的。 因為在不同線程里的操作我們無法預測其發(fā)生的順序,可能當它們按某種次序進行時, bug 不會出現(xiàn),當它們按另一種次序進行時, bug 就出現(xiàn)了。比如多線程那一節(jié)說到的那個銀行帳戶,

19、如果沒有加同步鎖,就會出現(xiàn)這種bug 。對這種 bug 的調(diào)試是很困難的,有時你運行程序發(fā)現(xiàn)了 bug ,而在進行調(diào)試的時候,由于執(zhí)行順序不同了, bug 又不出現(xiàn)了。為了解決這個問題,我想了一個辦法,就是利用同步事件,強行把多線程的程序按照預定好的順序去執(zhí)行。比如說有兩個線程,一開始就讓線程 1 運行,線程 2 睡覺,線程 1 運行到某個特定的點后,就換線程2 運行,線程1 睡覺。任何時候,都只有一個線程可以運行。我們可以在多次運行的過程中使用不同的執(zhí)行順序,如果按某種執(zhí)行順序運行之后 bug 浮現(xiàn)了, 那么就把這種順序記錄下來。然后按照這種順序進入調(diào)試,找出bug 。用這種方法一定要謹慎,

20、如果你的程序里本來就有線程同步的代碼,再加上這些強制的同步,可以會導致死鎖。=Visual Studio調(diào)試 (Debug) 小技巧b7b827e.html在 Visual Studio 運行調(diào)試過程中,有兩個非常有用的小工具:1,Command Window。2,Immediate Window。Command Window 用于執(zhí)行一些有用的命令。例如創(chuàng)建一個新文件可以使用命令:File.NewFile abc.cpp有趣的是提供一個和Dos 中 cls 類似命令。ImmediateWindow 提供在調(diào)試過程中運行一些有用的表達式,或者查看程序中的變量的值。例如程序中有兩個變量a 和 b

21、,現(xiàn)在要測試 a+b 的值,可以使用下面的命令(注意前面的 > 不可省略 ):>Debug.Print a + bMSDN 參考:ms-help:/MS.MSDNQTR.v90.en/dv_vscmds/html/48711628-1909-4713-a73e-d7b714c77f8a.htmms-help:/MS.MSDNQTR.v90.en/dv_vscmds/html/d33e79 37-73f3-4c69-9df0-777a8713c6f2.htm=在 vs2008 C+ 下調(diào)試控制臺程序的心得及技巧ual Studio2008 環(huán)境與 VC6.0 的環(huán)境存在著比較大的區(qū)別

22、,下面就一些小小的區(qū)別在這里做一些探討,歡迎指教!1、如果是調(diào)試控制臺程序,很多時候點擊 啟動調(diào)試 后是一閃而過, 此時可有兩種方法讓cmd 下 dos 調(diào)試屏幕暫停:A:不要直接點擊vs2008 的 啟動調(diào)試 按鈕,而是按 Control+F5組合鍵。B:在主函數(shù)main ()里 return 0; 前加上兩句: cin.get(); 樣式如下eg : int main()cout<< 這是一個調(diào)試屏幕暫停的例子!<<endl;cin.get();cin.get();return 0;2、類、函數(shù)和變量是C+ 編譯器的標準組件,它們都放置在名稱空間std中(此時頭文件

23、沒有后綴名h)。在vs2008C+下,如果不包含using namespace std;指令,那么必須使用std: 前綴,如#include stdafx.h#include<iostream>/頭文件沒有h 后綴名void simon(int); /函數(shù)原型/using namespacestd;沒有使用 std 名稱空間int _tmain(int argc, _TCHAR* argv)simon(3);std:cout<<請輸入一個整數(shù):;/必須使用std: 前綴,以下都是int count;std:cin>>count;simon(count);std:cout<<完成 !<<std:endl;std:cin.get();/這兩行是使調(diào)試屏幕暫停,不會一閃而過std:cin.get();/ 讓程序等待鍵擊return 0;/ 退出主函數(shù)void simon(int n) /自定義函數(shù)std:cout<< 現(xiàn)在整數(shù)是 <<n<< 測試! <<std:endl;下面是一個使用using namespace std;名稱空間的對比:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論