最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

分享Visual Studio原生開發(fā)的10個調(diào)試技巧

 更新時間:2013年08月13日 12:32:13   作者:  
我整理了一些Visual Studio 至少在VS 2008下 原生開發(fā)的調(diào)試技巧,下面是我的整理的一些技巧,需要的朋友可以參考下
最近碰巧讀了Ivan Shcherbakov寫的一篇文章,《11個強(qiáng)大的Visual Studio調(diào)試小技巧》。這篇文章只介紹了一些有關(guān)Visual Studio的基本調(diào)試技巧,但是還有其他一些同樣有用的技巧。我整理了一些Visual Studio(至少在VS 2008下)原生開發(fā)的調(diào)試技巧。(如果你是工作在托管代碼下,調(diào)試器會有更多的特性,在CodeProject中有介紹它們的文章),下面是我的整理的一些技巧:

異常中斷 | Break on Exception
Watch窗口中的偽變量 | Pseudo-variables in Watch Windows
符號越界后查看堆對象 |
查看數(shù)組的值
避免進(jìn)入不必要的函數(shù)
從代碼啟動調(diào)試器 | Launch the debugger from code
在Output窗口打印
隔離內(nèi)存泄漏
調(diào)試發(fā)行版 | Debug the Release Build
遠(yuǎn)程調(diào)試


技巧1: 異常中斷

在處理被調(diào)用之前,異常發(fā)生時可以 啟動調(diào)試器進(jìn)行中斷,可以讓你在異常發(fā)生后立即調(diào)試程序。操作調(diào)用棧便于你去查找異常發(fā)生的根本原因。

Vistual Studio允許你去指定想要中斷的異常類型或者特殊異常。選擇菜單Debug>Exceptions彈出對話框,你可以指定原生的(或者托管的)異常,除了調(diào)試器自帶的一些默認(rèn)異常,你還可以添加自己的自定義異常。

下面是一個std::exception 異常拋出時調(diào)試器中斷的例子。

更多閱讀:

技巧2:Watch窗口中的偽變量

Watch窗口或QuickWatch對話框提供一些特定的(調(diào)試器可識別的)變量,被稱為偽變量。文檔包含以下:

$tid—–當(dāng)前線程的線程ID
$pid——進(jìn)程ID
$cmdline———-啟動程序的命令行字符串
$user———-正在運(yùn)行程序的賬戶信息
$registername—–顯示寄存器registername 的內(nèi)容
不管怎么樣,關(guān)于最后一個錯誤的偽變量是非常有用的:

$err——–顯示最后一個錯誤的錯誤碼
$err,hr—顯示最后一個錯誤的錯誤信息

更多閱讀:偽變量

技巧3:符合越界后查看堆對象

有時候,在調(diào)試符號越界后,你還想查看對象的值,這個時候,watch窗口中的變量是被禁用的,不能再查看(也不能更新),盡管對象仍然存在。你如果知道對象的地址,可以繼續(xù)充分地觀察它。你可以將地址轉(zhuǎn)換為該對象類型的指針,放在watch窗中。

下面的例子中,當(dāng)單步跳出do_foo()之后,_foo不能再被訪問。但是,將它的地址轉(zhuǎn)換為foo*后,就可以繼續(xù)觀察這個對象。

技巧4:查看數(shù)組的值

如果你在操作一個很大的數(shù)組(我們假設(shè)至少有幾百個元素吧,但是可能更少),在Watch窗口中展開數(shù)組,查找一些特定范圍內(nèi)的元素很麻煩,因為你要不停地滾動.如果數(shù)組是分配在堆上的話,你甚至不能在watch窗口中展開數(shù)組元素.對此,有一個解決辦法。你可以使用(array+ <offset>),<count> 去查看從<offset>位置開始的特定范圍的<count>元素(當(dāng)然,這兒的數(shù)組是你的實際對象)。如果想查看整個數(shù)組,可以簡單使用array,<count>.

如果你的數(shù)組是在堆上,你可以在watch窗口中將它展開,但是要查看某個特定范圍的值,用法稍有不同:((T*) array + <offset>),<count>(注意這種用法對于堆上的多維數(shù)組也有效)。但是這種情況下,T是指數(shù)組元素的類型。

如果你在用MFC,并使用其中的'array'容器,像 CArray, CDWordArray,CStringArray等等。你當(dāng)然可以使用同樣的過濾方法。除此之外,你必須查看array的m_pData成員,它是保存數(shù)據(jù)的真實緩存。

技巧5:避免進(jìn)入不必要的函數(shù)

很多時候,你在調(diào)試代碼時可能會進(jìn)入到你想跳過的函數(shù),像構(gòu)造函數(shù),賦值操作或者其他的。其中最困擾我的是CString構(gòu)造函數(shù)。下面是一個例子,當(dāng)你準(zhǔn)備單步執(zhí)行take_a_string()函數(shù)時,首先進(jìn)入到CString的構(gòu)造函數(shù)。

void take_a_string(CString const &text){}void test_string(){ take_a_string(_T("sample"));}


幸運(yùn)的是可以告訴調(diào)試器去跳過哪些方法,類或者整個命名空間。實現(xiàn)它的方法也已經(jīng)改變了,回到使用VS6的日子,通常是通過autoexp.dat文件來指定的。Vistual Studio 2002改成了使用注冊表設(shè)置。想要跳過一些函數(shù),你需要在注冊表里添加一些值(詳情如下):

    實際位置取決于你使用的Vistual Studio版本和操作系統(tǒng)平臺(x86或x64,因為注冊表只能在64位的Windows下瀏覽)值的名字是數(shù)字,代表規(guī)則的優(yōu)先級;數(shù)字越大,優(yōu)先級越高。值數(shù)據(jù)是一個正則表達(dá)式的REG_SZ值,用于指定怎樣過濾和執(zhí)行。

為了避免進(jìn)入任何CString方法,我添加了下面的規(guī)則:

有了這個,即使你強(qiáng)制進(jìn)入上例中的take_a_string(),調(diào)試器也會跳過CString的構(gòu)造函數(shù)。

更多閱讀:

技巧6:從代碼啟動調(diào)試器 Launch the debugger from code

你可能很少需要將調(diào)試器附加到程序中,但你不能在Attach窗口這樣做(可能因為中斷發(fā)生太快而沒有捕獲到),你也不能一開始就在調(diào)試器中啟動程序。你可以在程序中產(chǎn)生中斷給調(diào)試器一個機(jī)會通過調(diào)用內(nèi)部的_degbugbreak()來附加。

復(fù)制代碼 代碼如下:

void break_for_debugging() {
__debugbreak();
}

實際上還有其他的方法來完成,例如觸發(fā)中斷3,但這僅僅適用于x86平臺(C++64位不再支持ASM)。另外還有DebugBreak()函數(shù),但它的使用不怎么簡便,所以這里推薦使用內(nèi)部方法。

復(fù)制代碼 代碼如下:
__asm int 3;

   程序運(yùn)行內(nèi)部方法時會停止運(yùn)行,這時你就有機(jī)會將調(diào)試器附加到該進(jìn)程。

更多閱讀:

技巧7:在output窗口打印

通過調(diào)用DebugOutputString可以在調(diào)試器的output窗口顯示一段特定的文本。如果沒有附加的調(diào)試器,該函數(shù)什么也不做。

更多閱讀:

技巧8:隔離內(nèi)存泄漏

內(nèi)存泄漏是在原生開發(fā)中的一個很重要的問題,要檢測內(nèi)存泄漏是一個很嚴(yán)峻的挑戰(zhàn),尤其是在大型項目中。Vistual Studio可以提供檢測內(nèi)存泄漏的報告,還有其他的一些應(yīng)用程序(免費(fèi)的或商業(yè)的)也可以幫助你檢測內(nèi)存泄漏.有些情況下,在一些內(nèi)存分配最終會導(dǎo)致泄漏時,可以使用調(diào)試器去中斷。但是你必須找到可再現(xiàn)的分配編號(盡管沒那么容易)。如果能做到這一點(diǎn),執(zhí)行程序時調(diào)試器才會中斷。

我們來看下面的代碼,分配了8個字節(jié),卻一直沒釋放分配的內(nèi)存。Visual Studio提供了造成內(nèi)存泄漏的對象的報告,多運(yùn)行幾次,會發(fā)現(xiàn)一直是同一個分配編號(341)。

復(fù)制代碼 代碼如下:

void leak_some_memory()
{
char* buffer = new char[8];
}
Dumping objects ->
d:\marius\vc++\debuggingdemos\debuggingdemos.cpp(103) : {341} normal block at 0x00F71F38, 8 bytes long.
Data: < > CD CD CD CD CD CD CD CD


在一個特定的(可復(fù)現(xiàn)的)位置中斷的步驟如下:

確定你有足夠的關(guān)于內(nèi)存泄漏的報告模式(參考 使用CRT庫檢測內(nèi)存泄漏)
多次運(yùn)行程序直到你能在程序運(yùn)行結(jié)束后的內(nèi)存泄漏報告里找到一個可復(fù)現(xiàn)的分配編號,例如上個例子中的(341)
在程序一開始的地方設(shè)置一個斷點(diǎn)以便你能夠盡早地進(jìn)行中斷。
當(dāng)最初的中斷發(fā)生時,watch窗口的Name欄里會顯示:{,,msvcr90d.dll}_crtBreakAlloc,在Value欄里寫入你想要查找的位置編號
繼續(xù)調(diào)試(F5)
程序執(zhí)行到指定位置會停止,你可以使用調(diào)用棧被指引找到被該位置觸發(fā)的那段代碼。
遵循這些步驟, 在上個例子中,使用分配的編號(341)就可以識別內(nèi)存泄漏的起因。

技巧9:調(diào)試發(fā)行版

調(diào)試和發(fā)布是兩個不同的目的。調(diào)試配置是用于開發(fā)的,而發(fā)布配置,顧名思義,是用來作為程序的最終版本,因為它必須嚴(yán)格遵循發(fā)布的質(zhì)量要求,該配置包含優(yōu)化部分和調(diào)試版本的中斷調(diào)試的設(shè)置。而且,有時候,要像調(diào)試調(diào)試版本一樣去調(diào)試發(fā)行版。要做到這一點(diǎn),你需要在配置里做一些改變。但是這種情況下,你就不再是在調(diào)試發(fā)行版,而是調(diào)試和發(fā)行的混合版。

你還應(yīng)該做一些事兒,以下是必須要做的:

配置C/C++ >General>Debug Information Format 應(yīng)該為 “Program Database(/Zi)”
配置C/C++ >Optimization>Optimization 應(yīng)該為”Disabld(/Od)”
配置Linker>Debugging>Generate Debug Info 應(yīng)該為”Yes/(DEBUG)”
如圖所示:

更多閱讀:怎樣調(diào)試發(fā)行版

技巧10:遠(yuǎn)程調(diào)試

另一個重要的調(diào)試就是遠(yuǎn)程調(diào)試,這是一個更大的話題,多次被提到,這里我只做一下簡單的概括:

你需要在遠(yuǎn)程機(jī)器上安裝遠(yuǎn)程調(diào)試監(jiān)控
遠(yuǎn)程調(diào)試監(jiān)控必須以管理員身份運(yùn)行,并且用戶必須屬于管理員組
在你運(yùn)行監(jiān)控時,會開啟一個新的服務(wù),該服務(wù)的名字必須用Visual Studio的Attach to Progress窗口的Qualifier組合框的值。

  1. 遠(yuǎn)程和本地機(jī)器上的防火墻必須允許Visual Studio和遠(yuǎn)程調(diào)試監(jiān)控之間能夠通信
  2. 想要調(diào)試,PDB文件是關(guān)鍵;為了能夠讓VisualStudio自動加載它們,必須滿足以下條件:

1)本地的PDB文件必須可用(在遠(yuǎn)程機(jī)器的相同路徑下放置一個對應(yīng)的模塊)。

 2) 遠(yuǎn)程機(jī)器上的托管PDB文化必須可用。

遠(yuǎn)程調(diào)試監(jiān)控下載:

更多閱讀:

結(jié)束語

Ivan Shcherbakov那篇文章和我這篇文章提到的調(diào)試技巧,在大多數(shù)的調(diào)試問題中都是必不可少的。想要知道更多的關(guān)于調(diào)試技巧的知識,建議閱讀文章中提供的額外閱讀。

原文鏈接: Marius Bancila   翻譯: 伯樂在線 - 伯樂在線讀者
譯文鏈接: http://blog.jobbole.com/45249/

相關(guān)文章

  • c# datatable用法總結(jié)

    c# datatable用法總結(jié)

    在項目中經(jīng)常用到DataTable,如果DataTable使用得當(dāng),不僅能使程序簡潔實用,而且能夠提高性能,達(dá)到事半功倍的效果,現(xiàn)對DataTable的使用技巧進(jìn)行一下總結(jié)。
    2010-09-09
  • .NET?Core類庫項目中讀取appsettings.json配置的方法

    .NET?Core類庫項目中讀取appsettings.json配置的方法

    ASP.NET?Core是一個全新的Web開發(fā)平臺,微軟在它上面構(gòu)建了MVC、SingalR、GRPC、Orleans這樣廣泛使用的Web框架,今天通過本文給大家詳細(xì)介紹下.NET?Core讀取appsettings.json配置的方法,感興趣的朋友一起看看吧
    2022-03-03
  • ASP.NET?Core應(yīng)用JWT進(jìn)行用戶認(rèn)證及Token的刷新方案

    ASP.NET?Core應(yīng)用JWT進(jìn)行用戶認(rèn)證及Token的刷新方案

    本文詳細(xì)講解了ASP.NET?Core應(yīng)用JWT進(jìn)行用戶認(rèn)證及Token的刷新方案,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • asp.net實現(xiàn)在線音樂播放器示例

    asp.net實現(xiàn)在線音樂播放器示例

    這篇文章主要介紹了asp.net實現(xiàn)在線音樂播放器示例,需要的朋友可以參考下
    2014-02-02
  • 安裝.NET Framework進(jìn)度條卡住不動的解決方案(推薦)

    安裝.NET Framework進(jìn)度條卡住不動的解決方案(推薦)

    VS在安裝之前需要安裝.NET Framework,我安裝的是4.0版本。但是安裝進(jìn)度條到一半左右時就卡住不動了。前前后后重試多次,還有幾次重新開機(jī),但都沒用,怎么解決呢,下面給大家分享下解決方案
    2016-12-12
  • ASP.NET中 script runat server 的用法

    ASP.NET中 script runat server 的用法

    這篇文章主要介紹了ASP.NET中<script runat="server">的用法,以一個較為簡單的例子分析了ASP.NET中<script runat="server">的特點(diǎn)及具體用法,對于asp.net初學(xué)者來說具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-11-11
  • nunit使用指南之—NUnit Quick Start

    nunit使用指南之—NUnit Quick Start

    nunit使用指南之—NUnit Quick Start...
    2007-03-03
  • asp.net下用Aspose.Words for .NET動態(tài)生成word文檔中的圖片或水印的方法

    asp.net下用Aspose.Words for .NET動態(tài)生成word文檔中的圖片或水印的方法

    本文詳細(xì)講解如何使用Aspose.Words for .NET的組件來生成word文檔與水印的方法,請看本文內(nèi)容。
    2010-04-04
  • Asp.net 網(wǎng)站性能優(yōu)化二則分享

    Asp.net 網(wǎng)站性能優(yōu)化二則分享

    Web服務(wù)器的性能優(yōu)化有很多資料介紹了,多臺主機(jī)負(fù)載均衡,查詢結(jié)果的多級緩存,數(shù)據(jù)庫索引優(yōu)化等都是常見的優(yōu)化手段。
    2011-08-08
  • .NET8中g(shù)RPC的使用方法詳解

    .NET8中g(shù)RPC的使用方法詳解

    gRPC是一種高性能、開源的遠(yuǎn)程過程調(diào)用(RPC)框架,基于 HTTP/2 協(xié)議,支持雙向流、頭部壓縮等特性,下面我們就來看看.NET8下gRPC的具體使用吧
    2025-03-03

最新評論

体育| 马边| 大竹县| 郑州市| 岑巩县| 福清市| 廊坊市| 湖北省| 泰安市| 岳西县| 汉源县| 长岛县| 东至县| 灵璧县| 孙吴县| 翁源县| 台前县| 曲周县| 青神县| 合水县| 玛纳斯县| 苍南县| 新丰县| 霸州市| 会昌县| 滁州市| 轮台县| 泰州市| 易门县| 灵石县| 湘潭市| 巴南区| 阿合奇县| 镇沅| 庆城县| 额敏县| 洛南县| 工布江达县| 威远县| 庆云县| 临漳县|