VS2005調(diào)試技巧集合http://blog.csdn.net/rainylin/archive/2007/09/06/1775125.aspx下面有從淺入深的6個(gè)問題,您可以嘗試回答一下
問題1,2
這兩個(gè)問題最簡單,我在一個(gè)例子里說明 例如如下循環(huán) for(int i=0;i<1000;i++){doSomeThing......} 在循環(huán)的大括號(hào)上單擊右鍵,插入斷點(diǎn),用這個(gè)方法,可以對(duì)付那些喜歡把語句寫在一行上的家 伙,其實(shí),隨著.Net3.5中Linq的出現(xiàn),我們肯定也會(huì)經(jīng)常在在一行上寫復(fù)雜的表達(dá)式,這個(gè)時(shí)候用這種插入方法會(huì)比較管用 ok,現(xiàn)在我們來編輯這個(gè)斷點(diǎn)的條件,在斷點(diǎn)上右鍵單擊,選擇如圖菜單項(xiàng) 在彈出的窗口中可以設(shè)置斷點(diǎn)命中的條件i==900 注意我是在調(diào)試C#代碼,默認(rèn)的條件語句語法是C#,如果你想切換,那就需要用Ctrl- B,來插入斷點(diǎn),并在彈出窗口中選擇語言 通過這樣設(shè)置條件斷點(diǎn),我們就可以解決我們的問題1,2了
問題3 你有一個(gè)表達(dá)式在上面循環(huán)的某一次發(fā)生了變化,你想知道是哪一次,在哪個(gè)地方,怎么才能做到?
同樣通過設(shè)置條件斷點(diǎn)我們還可以解決我們的問題3,對(duì)表達(dá)式變化的跟蹤 string user="yizhu2000" for(int i=0;i<10000;i++){ DoSomething1() ....... DoSomethingN() } 當(dāng)循環(huán)執(zhí)行完畢時(shí)我們發(fā)現(xiàn)user變成了"smart_boy",你不知道這個(gè)值是在第幾次 循環(huán)的時(shí)候變化的,那么你是不是會(huì)選擇打上斷點(diǎn),一次一次中斷,來查看呢?當(dāng)然不用 在循環(huán)體結(jié)束的位置我們設(shè)置一個(gè)斷點(diǎn),打開條件編輯窗口(打開方法同上),設(shè)置表達(dá)式為 user,勾選下面的HasChanged,也就是說,你告訴斷點(diǎn),當(dāng)user的值發(fā)生變化時(shí)才觸發(fā) (注意:第一次執(zhí)行到斷點(diǎn)的時(shí)候,程序一定會(huì)中斷,并計(jì)算這時(shí)表達(dá)式的值,所以,所謂發(fā)生變 化,指的是以后執(zhí)行到斷點(diǎn)是表達(dá)式的值和第一次執(zhí)行到斷點(diǎn)時(shí)表達(dá)式的值的比較) 問題4 你希望你的斷點(diǎn)在被命中100次后,每命中三次中斷一次,比如第103,第106,第109怎樣做?
如何讓斷點(diǎn)在指定的命中次數(shù)或者大于某個(gè)次數(shù)時(shí)觸發(fā)呢?方法是設(shè)定幾個(gè)斷點(diǎn)的 HitCount,右鍵單擊斷點(diǎn),在彈出菜單中選擇Hit Count,會(huì)彈出如下窗口 在"when the break point is hit"下拉列表里,我們可以看到四個(gè)選項(xiàng) break always:總是中斷 break when the hit count is equal to:等于某次數(shù)時(shí)中斷 beak when the hit count is a multpile of:當(dāng)次數(shù)是某數(shù)的倍數(shù)時(shí)中斷 break when the hit count is greater than or equal to:當(dāng)大于等于某數(shù)時(shí)中斷 問題5 你有在調(diào)試一個(gè)服務(wù)程序,希望在其內(nèi)部打上了斷點(diǎn),可是,由于這是一個(gè)公用的服務(wù)你不希望其他訪問這個(gè)服務(wù)的程序被你的調(diào)試所干擾,你想
怎么辦?
前面4個(gè)問題都已經(jīng)解決了,第5個(gè)問題的解決方法是利用斷點(diǎn)的Filter功能,比如我希望 斷點(diǎn)只有被機(jī)器名為yizhu的機(jī)器訪問才能觸發(fā),我可以這樣設(shè)置 當(dāng)其他機(jī)器訪問程序的時(shí)候,斷點(diǎn)將不會(huì)觸發(fā),這樣做的優(yōu)點(diǎn)是通過設(shè)置機(jī)器名,我們可以讓其他 機(jī)器訪問的時(shí)候感覺不到斷點(diǎn)的存在,除此之外我們可以設(shè) 置機(jī)器名,進(jìn)程號(hào),進(jìn)程名,線程號(hào),線程名作為filter,而且還可以把他們組合起來,比如我希望通過當(dāng)機(jī)器yizhu的dllhost進(jìn)程調(diào)用時(shí)才觸 發(fā),那么問題就可以設(shè)置為MachineName="yizhu"&ProcessName="dllhost" 問題6 怎樣知道2個(gè)斷點(diǎn)中斷的時(shí)間間隔
現(xiàn)在我們來解決第6個(gè)問題: 在程序性能調(diào)試的時(shí)候,我們經(jīng)常需要知道某段代碼的執(zhí)行效率,一般來說,我們可以在程序中加 入時(shí)間點(diǎn),通過時(shí)間點(diǎn)相減來取得時(shí)間間隔,這種方法有個(gè) 顯而易見的缺點(diǎn)就是需要修改程序,想要不修改程序,就需要借助一些工具,那么有沒有什么方法可以聲明式的插入時(shí)間點(diǎn),并計(jì)算值呢?其實(shí)斷點(diǎn)完全可以做到 在給出方法前,我們來看看斷點(diǎn)的另外一個(gè)設(shè)置項(xiàng),When Hit,這個(gè)選項(xiàng)可以 我們輸出了變量user的值,下面Continue Execution表示程序不會(huì)中斷,輸出后繼續(xù)執(zhí)行,注意表達(dá)式需要用{}括起來,,其他的部分會(huì)被作為字符串輸出。設(shè)定WhenHit后斷點(diǎn)變成了方 形(看厭了圓斷點(diǎn),我還挺喜歡這個(gè)方家伙的) 在output中查看輸出結(jié)果,如下: 既然可以計(jì)算表達(dá)式,我們的第一個(gè)最簡方案就出來了,也就是在程序執(zhí)行到斷點(diǎn)的時(shí)候,輸出 DateTime.Now,這樣當(dāng)然是可行的,但是我們需 要的是時(shí)間間隔,所以我們還需要自己來算個(gè)減法,還是挺麻煩的,怎么樣才能讓程序自己輸出時(shí)間間隔呢?有一個(gè)想法是這樣的,我們在上一個(gè)斷點(diǎn)聲明一個(gè)時(shí)間 變量,然后在下面的斷點(diǎn)里用DataTime.Now減去這個(gè)變量,即 斷點(diǎn)一的條件:{DateTime _t=DateTime.Now;} 斷點(diǎn)二的條件:{DateTime.Now-t;} 看起來不錯(cuò),但是實(shí)際運(yùn)行時(shí)就有問題了,讓我們看看輸出吧 上面高亮的部分說,變量申明只能在immediate window中進(jìn)行,所以斷點(diǎn)一的變量沒有申明成功,關(guān)于immediatewindow,我們以后會(huì)涉獵到,反正就是說想在表達(dá)式里申明變量,沒門,死 路一條.那么我們怎么才能不申明變量又時(shí)間點(diǎn)呢? 這時(shí)我想起了Thread.SetData 方法,這個(gè)方法可以往當(dāng)前線程專門提供的空間中插入一些數(shù)據(jù),并且可以通過GetData得到數(shù)據(jù),具體細(xì)節(jié)參考 http://msdn2.microsoft.com/zh-cn/library/system.threading.thread.setdata(VS.80).aspx 于是方案就有了,在第一個(gè)斷點(diǎn)處把時(shí)間放入Thread的DataSlot,然后第二個(gè)斷點(diǎn) 取出來相減 斷點(diǎn)一的條件: {Thread.SetData(Thread.GetNamedDataSlot("ExecutionTime"),DateTime.Now);} 斷點(diǎn)二的條件: {DateTime.Now-(DateTime)System.Threading.Thread.GetData(System.Threading.Thread.GetNamedDataSlot("ExecutionTime"));} 看看輸出效果 我們的目的已經(jīng)達(dá)到了,output中成功的輸出了時(shí)間間隔,當(dāng)然,還不是很完善,首先,這 個(gè)方法限于兩個(gè)斷點(diǎn),你想多打幾個(gè)斷點(diǎn),測試兩兩間的間隔還是比較麻煩.測量精度也可以提高,大家有興趣可以自己研究這個(gè)方法的擴(kuò)展
================================== 《高效編程十八式》(11/13)調(diào)試http://blog.sina.com.cn/s/blog_4ed027020100hgr6.html調(diào)試王偉冰
============================================= Visual Studio 調(diào)試(Debug)小技巧 http://hi.baidu.com/liudong/blog/item/d0434c08c6d315970b7b827e.html 在Visual Studio 運(yùn)行調(diào)試過程中,有兩個(gè)非常有用的小工具: Command Window用于執(zhí)行一些有用的命令。例如創(chuàng)建一個(gè)新文件可以使用命令: Immediate
Window提供在調(diào)試過程中運(yùn)行一些有用的表達(dá)式,或者查看程序中的變量的值。例如程序中有兩個(gè)變量a和b,現(xiàn)在要測試a+b的值,可以使用下面的命令
(注意前面的>不可省略): MSDN參考: ==================================== 在vs2008 C++下調(diào)試控制臺(tái)程序的 心得及技巧Visual Studio 2008環(huán)境與VC6.0的環(huán)境存在著比較大的區(qū)別,下面就一些小小的區(qū)別在這里做一些探討,歡迎指教! 1、如果是調(diào)試控制臺(tái)程序,很多時(shí)候點(diǎn)擊“啟動(dòng)調(diào)試”后是一閃而過,此時(shí)可有兩種方法讓cmd下dos調(diào)試屏幕暫停: A:不要直接點(diǎn)擊vs2008的“啟動(dòng)調(diào)試”按鈕,而是按Control+F5組合鍵。 B:在主函數(shù)main()里“return 0;”前加上兩句:cin.get();樣式如下 eg: int main() 2、類、函數(shù)和變量是C++編譯器的標(biāo)準(zhǔn)組件,它們都放置在名稱空間std中(此時(shí)頭文件沒有后綴名h)。在vs2008 C++下,如果不包含using namespace std;指令,那么必須使用std::前綴,如 #include "stdafx.h" void simon(int); //函數(shù)原型 //using namespace
std; int _tmain(int argc, _TCHAR* argv[]) void simon(int n) //自定義函數(shù) 下面是一個(gè)使用using namespace std;名稱空間的對(duì)比: #include "stdafx.h" void simon(int); using namespace std; //這是一個(gè)使用std;名稱空間的例子 int _tmain(int argc, _TCHAR* argv[]) void simon(int n) 還有一種方法,就是既不使用std;名稱空間,也不使用std::前綴,而是使用using編譯指令。如: #include "stdafx.h" using std::cout; //直接使用using指令
//using namespace std; //這是一個(gè)既沒有使用std;名稱空間也沒有使用std::前綴的例子 int _tmain(int argc, _TCHAR* argv[]) void simon(int n) =========================== |
|