• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            譯文:我是怎樣使用BoundsChecker的

            轉(zhuǎn)載自:http://blog.csdn.net/BBirdlyh/article/details/1935894


            我是怎樣使用
            BoundsChecker
            ――譯自http://www.codeguru.com/cpp/v-s/debug/debuggers/article.php/c4417/    
            John Robbins How I use BoundsChecker
             
            在開始本文之前,我想聲明的是我曾經(jīng)在NuMega工作過,并在那里參與編寫了BoundsChecker的3、4、5版本。顯然,我個人非常推崇BoundsChecker,盡管還會有一些其它能與BoundsChecker相媲美的產(chǎn)品也非常值得大家的注意,比如Rational的Purify。
            作為一個終日研究調(diào)試的人,我被問到最多的問題就是,我是怎么將Compuware/NuMega BoundsChecker融入實際工作中并使用它來解決問題的。許多人都在使用或正在考慮使用BoundsChecker,但很少有人能夠最大限度的使用這個復(fù)雜的產(chǎn)品。在這篇文章里,我將向大家介紹BoundsChecker中很容易被混淆的幾個部分并向大家展示我是怎樣將BoundsChecker運用的日常的開發(fā)中去的。這其中也包含了使用BoundsChecker在擴(kuò)展ISAPI中進(jìn)行調(diào)試,這是我遇到過的最難的部分。
            如果你了解NuMega的生產(chǎn)線,你可能注意到他們還有另外一個產(chǎn)品,名字叫做SmartCheck。SmartCheck是BoundsChecker的姊妹版,用于Visual Basic的調(diào)試。這兩個產(chǎn)品在功能上是類似的。但因為SmartCheck理解所有VB的技術(shù),它可以用VB的語法形式顯示事件以及分析VB語法中的的錯誤。在這篇文章中我只會使用BoundsChecker,如果你是VB的開發(fā)人員,你只需簡單的把BoundsChecker替換為SmartCheck就可以了,因為這兩個產(chǎn)品從本質(zhì)上講是一模一樣的。一點主要的不同是,SmartCheck沒有FinalCheck技術(shù)但BoundsChecker有。
             
            撥開云霧
            BoundsChecker是一個很棒的錯誤診測工具,它可以發(fā)現(xiàn)所有的內(nèi)存破壞問題,無論它們是分配在堆、靜態(tài)存儲區(qū)或是堆棧上。在我看來,BoundsChecker最牛的地方是它能夠檢查API/COM的參數(shù)。因為Windows API已經(jīng)變得很大,為了不超出負(fù)荷,在不同部分之間會有一些微妙的聯(lián)系。你可能會覺得GetVersionEx只是直接的數(shù)據(jù)傳遞,但它也會莫名的失敗。OSVERSIONINFO結(jié)構(gòu)中有一個很煩人的size域,你必須在把結(jié)構(gòu)傳給GetVweisonEx之前填充它。BoundsChecker可以很輕易的發(fā)現(xiàn)諸如此類的問題,你完全可以將時間和精力放在程序的特性上,而不是花大量的時間在這種愚蠢的問題上。如果想最大限度的了解BoundsChecker,你可以瀏覽www.numega.com上的文章。
            BoundsChecker十分容易被混淆的地方是,它有兩種工作模式:Active Check 和Final Check。我認(rèn)為部分問題在于,人們對這兩種模式在什么情況下使用存在著一些錯誤的說法。Active Check不需要重新編譯也會為你找到大量的錯誤,可以以兩種方式使用Active Check:可以在開發(fā)環(huán)境中使能BoundsChecker功能執(zhí)行調(diào)試,也可以在BC.EXE中直接打開編譯好的文件。FinalCheck需要重新編譯,因為它需要將BoundsChecker的指令嵌入到工程上下文中以便隨時做出精確的錯誤報告(比如到底在哪一行代碼出現(xiàn)了內(nèi)存泄漏)而不是象Active Check那樣需要等到程序結(jié)束。有一個問題是,有些人會錯誤的認(rèn)為從BoundsChecker得到任何錯誤檢查都需要重新編譯整個程序。當(dāng)你看了我是怎樣選擇使用這兩種模式時,你就會知道實際情況到底是什么樣。
            我想提出的最后一個問題是BoundsChecker的性能問題。假定,通常十分鐘就可以執(zhí)行完的程序用BoundsChecker卻需要三個小時,這肯定是一個大問題。但我也聽到一些開發(fā)人員說他們因為BoundsChecker需要多花幾分鐘的時間來運行整個程序所以不用BoundsChecker。如果你寧愿花2周時間來跟蹤定位BoundsChecker很輕而易舉就找到的問題也不愿意在運行時多花一兩分鐘的話我也沒什么話好說。BoundsChecker能夠加入對所有參數(shù),內(nèi)存,返回值以及COM接口的跟蹤。通常時間是很寶貴的,能盡快找到程序的錯誤是最好不過的事情。如果你僅僅因為“慢”而不使用錯誤檢查工具,就會在代碼中留下大量的問題。
             
            我喜歡用的的設(shè)置方法
            BoundsChecker大量的選項可能就會讓你忙活一陣子。別著急,我給你來個簡單的。設(shè)置錯誤檢測級別為最大模式,因為我覺得正常模式會壓制一些你需要看到的錯誤。如果你從沒使用過最大模式,你會感覺比以前更多的錯誤報告彈出來。不要著急,如果你不想關(guān)心存在于第三方代碼中的錯誤的話點擊suppress就好了。設(shè)置最大模式的方法是:打開VC的IDE或者BoundsChecker獨立的外殼程序,BC.EXE,但不要加載任何工程或可執(zhí)行文件。在BoundsChecker設(shè)置窗口的錯誤診測標(biāo)簽下最大模式。這樣以后你所打開的任何工程或文件就都會使用最大模式了。
            如果我要跟蹤一些非?;靵y的內(nèi)存問題,我就會選擇自定義模式。所有其它設(shè)置都是跟最大模式相同的,但我會在“Memory error checking”選項中選中“Check all heap blocks on each memory function call”。這樣一來,內(nèi)存總是會被檢查到,執(zhí)行雖然慢一些,但錯誤報告會定位到更接近出錯代碼的地方。
            默認(rèn)情況下,我不會選擇“Collect and report program event data”一項。當(dāng)我想看到程序流程時我也只會打開事件報告。如果我必須看到所有事件,我就會將“Additional Event Reporting”里面的所有選項都選中。但有一個我通常是關(guān)掉的,就是“Event Reporting”選項卡里面的“Prompt to save program results”。因為大多時候,僅從BoundsChecker里面看一下實時的日志就可以了,沒必要將它們保存起來。
            使用BoundsChecker
            就算NuMega的市場部要槍殺我,我還是要承認(rèn)我并不是每時每刻都會使用BoundsChecker。在開發(fā)新代碼或是更新現(xiàn)有代碼時我會遵循標(biāo)準(zhǔn)的模式:寫一小段代碼,可能是幾個函數(shù)或者是一個復(fù)雜函數(shù)的初始化部分,然后立即調(diào)試,測試這段代碼。這樣我就可以大體上評估一下程序的邏輯和流程。因為BoundsChecker不能發(fā)現(xiàn)這種類型(邏輯、流程――譯著)的問題,所以我會在程序的一開始就去避免它們的出現(xiàn)。當(dāng)我完成某個功能或是寫完一段重要的代碼(比如100-200行,包括注釋)時,我就會打開BoundsChecker或者直接運行BC.EXE,使用ActiveCheck來測試我的這段代碼。我發(fā)現(xiàn),在這樣的漸增的開發(fā)模式下,ActiveCheck不會發(fā)現(xiàn)太多的錯誤。實際上,如果你的工作正確無誤,你不會用BoundsChecker找到任何錯誤。
            在開發(fā)代碼時,大約每天或者頂多每隔一天,我就會用BoundsChecker的Final Check來測試所有新代碼。對于這樣的測試版本,我會盡可能覆蓋到每句代碼。因為可以同時使用BoundsChecker和TrueCoverage,我通常會把兩個都打開,這樣我就會知道哪部分代碼還需要更多的測試(沒有覆蓋到――譯著)。
            我會在把代碼提交到主代碼之前反復(fù)使用BoundsChecker來錘煉它們,這是很關(guān)鍵的。如果開發(fā)小組的每個人都這么做的話,主代碼的質(zhì)量就會大幅度提高。是的,這樣做花費在代碼測試上的功夫會超乎想象,但我認(rèn)為代碼質(zhì)量是每個開發(fā)者的責(zé)任,我們必須做好充分的準(zhǔn)備去保證它們的質(zhì)量。
            我還想告訴大家的是Final Check的使用強度問題。如果我參與的是一個很大的程序,我通常只會在我添加了代碼的模塊中使用Final Check。沒必要將超過15個模塊的30MB代碼都提交給BoundsChecker。每周,我會將整個工程全部提交一次,來測試它的所有路徑,這樣,你就不會看到任何未知的錯誤。
            我前面建議大家用最大診測模式,你可能會看到更多的錯誤彈出。為了不讓這些錯誤報告打斷程序的運行,我經(jīng)常會關(guān)掉“Report Errors Immediately”。運行完之后,再從頭到尾查看錯誤信息。錯誤經(jīng)常會分布在很多不同模塊中,而有一些是沒有源代碼的。比如,當(dāng)我使用Intellipoint軟件時,它會調(diào)用到MSH_ZWF.DLL來處理鼠標(biāo)滾輪的相關(guān)功能。當(dāng)在BoundsChecker打開執(zhí)行這個程序時,會彈出一些屬于DLL的錯誤。顯然,所有出自MSH_ZWF.DLL的錯誤都是我想壓制的。我可以通過下面的方法來做到這一點:在這個錯誤上右擊,彈出菜單選擇“Suppress”在彈出的對話框中選擇“Suppress this error only when it occurs in the EXE or DLL”。任何類型的錯誤,只要它是出現(xiàn)在沒有代碼的模塊中的,就可以首先檢查這個錯誤是否是傳遞錯誤的參數(shù)造成的,如果排除了這一點,通常就可以安全的將這個錯誤壓制掉。我最關(guān)心的錯誤其實是在我所擁有代碼中出現(xiàn)的錯誤,并且這些錯誤是我寫入的代碼導(dǎo)致的。
            對于那些并非出自我代碼中的錯誤,我會認(rèn)真的評估一下。如果BoundsChecker報告的是API調(diào)用失敗,我會看一下我是否恰當(dāng)?shù)臋z驗了返回值,如果是這樣,我就會將錯誤壓制掉。當(dāng)遇到內(nèi)存泄漏的錯誤時,我會更加小心的進(jìn)行檢查。有時候,當(dāng)應(yīng)用程序調(diào)用ExitProcess后,BoundsChecker的注入DLL,BCCORE.DLL會先于程序的其它部分退出。在這種情況下,BoundsChecker為了安全起見,會將所有內(nèi)存分配都看作內(nèi)存泄漏。所以當(dāng)靜態(tài)類分配內(nèi)存或資源時,你會經(jīng)??吹絻?nèi)存或資源泄漏,這是因為靜態(tài)類是進(jìn)程中最后被釋放的東西。這種情況下,如果你能確保會恰當(dāng)?shù)尼尫艃?nèi)存和資源,將這些錯誤壓制也是安全的。
            我是個妄想狂,我經(jīng)常會把工程的錯誤壓制文件(.SUP)更名,來檢查一下我是否將真正的錯誤也失手壓制了。工程的.SUP文件和可執(zhí)行文件放在同一個目錄下。如果你是一個項目小組的一員,你很可能會想將自己的.SUP文件整合到整個項目的.SUP文件中去。這個很容易,因為.SUP文件只是一個文本文件。你只要保證不要更改.SUP的開頭部分(如下面所示)然后將自己.SUP文件中以“ignore”開頭的每一行拷貝到項目.SUP文件中就可以了。但要注意,每一行都是以“;”結(jié)尾的。
            //SUPPRESSIONPROJ:wordpad
            //VERSION:5.00
            //ENABLE:Yes
            !include Mfc.sup ; NOTE!!include's lines are part of the header.
             
            ignore failure USER32.DLL:ShowCaret in module RICHED20.DLL
            ignore param 1 GDI32.DLL:GetDeviceCaps in module RICHED20.DLL
            ignore param 1 USER32.DLL:GetSystemMetrics in module CSCUI.DLL
            ignore param 1 KERNEL32.DLL:VerifyVersionInfoW in module CSCUI.DLL
            ignore failure KERNEL32.DLL:VerifyVersionInfoW in module CSCUI.DLL
            為了減輕我在錯誤壓制上面做的繁瑣工作,我會將沒有代碼的DLL加入到主.SUP文件中去。主.SUP文件在BoundsChecker安裝目錄的/Data目錄下,SKIP_32C.SUP是Windows 9x下使用的,SKIP_NT.SUP是NT/2000下使用的。這兩個文件里已經(jīng)包含了很多DLL,但你可能擁有一些第三方庫,而你不想看到這些庫中的錯誤報告。比如,如果我想將MSH_ZWF.DLL加進(jìn)主.SUP中,我可以打開SKIP_NT.SUP,在文件的底部加入一行:
            ignore everything in module MSH_ZWF.DLL
            在擴(kuò)展的ISAPI中使用BoundsChecker
            現(xiàn)在每個人都準(zhǔn)備建立下一個amazon.com,所以似乎每個人都會在自己的web站點中使用ISPAI擴(kuò)展。但調(diào)試擴(kuò)展ISAPI是十分困難的,而且想要使用內(nèi)存診測工具更困難。幸運的是,我發(fā)現(xiàn)了一些小技巧,使使用內(nèi)存診測工具變得非常簡單。正如你所知道的,可以以提示符模式運行IIS(MSDN有一篇文章“TN063: Debuging Internet Extension DLLs”)。這使我們的調(diào)試變得相對比較簡單,但想使內(nèi)存診測工具能正確報告內(nèi)存泄漏還需要一些其它的設(shè)置。
            我的技巧就是,在擴(kuò)展DLL中加入個特殊的命令,比如“killIIS”,這個命令可以在瀏覽器中調(diào)用。命令響應(yīng)函數(shù)所作的僅僅是調(diào)用ExitProcess。這樣就可以在VC++中使用BoundsChecker得到錯誤信息了。盡管以命令提示符模式執(zhí)行IIS還存在一些問題,但如果能徹底的進(jìn)行錯誤檢查,這樣做也是值得的。
            小結(jié)
            這篇文章中,我只是粗淺的介紹了一下BoundsChecker的強大功能。還有一個地方我沒有介紹到,就是你可以在BoundsChecker加入自己的函數(shù)參數(shù)檢查策略,當(dāng)你的程序由于調(diào)用了某些API而不能在其它版本的Windows上使用時BoundsChecker就會報告這個錯誤。我希望大家從這篇文章中得到了一些使用BoundsChecker的好的思路,并幫助你們加快程序調(diào)試的速度。以后的專欄中,我會簡單介紹一下逆向工程技術(shù),所以請大家想一想BoundsChecker在逆向工程的用處。

            posted on 2014-04-24 23:11 楊粼波 閱讀(1089) 評論(0)  編輯 收藏 引用

            国产成人久久精品一区二区三区| 久久精品免费全国观看国产| 久久综合噜噜激激的五月天| 国产精品美女久久久| 思思久久99热只有频精品66| 老色鬼久久亚洲AV综合| 国产亚洲美女精品久久久| 热RE99久久精品国产66热| 久久久久亚洲AV无码永不| 久久精品国产99国产精品| 久久久亚洲裙底偷窥综合| 99久久免费国产精精品| 久久无码国产| 成人资源影音先锋久久资源网| 久久久精品国产亚洲成人满18免费网站| 久久人与动人物a级毛片| 久久久久久综合一区中文字幕| 久久乐国产综合亚洲精品| 国产精品视频久久| 性高湖久久久久久久久| 欧美午夜精品久久久久久浪潮| 国产精品一久久香蕉产线看| 久久国产免费直播| 91精品国产乱码久久久久久| 欧美激情一区二区久久久| 久久精品国产亚洲av瑜伽| 亚洲午夜久久影院| 97精品久久天干天天天按摩 | 久久久亚洲精品蜜桃臀| 久久超碰97人人做人人爱| 久久久亚洲裙底偷窥综合| 理论片午午伦夜理片久久| 久久综合九色综合久99| 久久精品国产精品亚洲人人| 国产69精品久久久久99| 久久福利青草精品资源站| 久久久久久久亚洲Av无码| 久久精品一本到99热免费| 色综合久久中文字幕无码| 久久AV高清无码| 久久综合久久综合久久|