VisualStudio原生開發(fā)的調試技巧有哪些-創(chuàng)新互聯(lián)

本篇內(nèi)容介紹了“Visual Studio原生開發(fā)的調試技巧有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于成都網(wǎng)站建設、網(wǎng)站設計、和田網(wǎng)絡推廣、微信小程序、和田網(wǎng)絡營銷、和田企業(yè)策劃、和田品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學生創(chuàng)業(yè)者提供和田建站搭建服務,24小時服務熱線:13518219792,官方網(wǎng)址:muchs.cn



技巧1: 異常中斷

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

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



Visual Studio原生開發(fā)的調試技巧有哪些

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

Visual Studio原生開發(fā)的調試技巧有哪些

更多閱讀:

  • 1.  異常拋出時如何中斷

  • 2.  如何添加新的異常

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

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

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

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



Visual Studio原生開發(fā)的調試技巧有哪些

更多閱讀:偽變量

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

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

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

Visual Studio原生開發(fā)的調試技巧有哪些

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

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



Visual Studio原生開發(fā)的調試技巧有哪些

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

Visual Studio原生開發(fā)的調試技巧有哪些

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

Visual Studio原生開發(fā)的調試技巧有哪些

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

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

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


Visual Studio原生開發(fā)的調試技巧有哪些

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

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

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

Visual Studio原生開發(fā)的調試技巧有哪些

有了這個,即使你強制進入上例中的take_a_string(),調試器也會跳過CString的構造函數(shù)。

更多閱讀:

  •  使用Visual C++調試器怎樣避免進入函數(shù)

  • 使用AutoExp.dat調整調試器

技巧6:從代碼啟動調試器 Launch the debugger from code

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

復制代碼 代碼如下:


void break_for_debugging() {
__debugbreak();
}


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

復制代碼 代碼如下:

__asm int 3;

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

Visual Studio原生開發(fā)的調試技巧有哪些

Visual Studio原生開發(fā)的調試技巧有哪些

Visual Studio原生開發(fā)的調試技巧有哪些

更多閱讀:

  •  內(nèi)部方法_debugbreak

  • 任何時候都離不開設置斷點和斷言

  • Visual Studio 20005/2008的調試,第四部分:為調試器設置代碼

技巧7:在output窗口打印

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



Visual Studio原生開發(fā)的調試技巧有哪些

更多閱讀:

  • 函數(shù)OutputDebugString

  • 函數(shù)OutputDebugString的調用機制

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

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

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



復制代碼 代碼如下:


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




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

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



Visual Studio原生開發(fā)的調試技巧有哪些

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

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



Visual Studio原生開發(fā)的調試技巧有哪些

你還應該做一些事兒,以下是必須要做的:

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



Visual Studio原生開發(fā)的調試技巧有哪些

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

技巧10:遠程調試

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

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



Visual Studio原生開發(fā)的調試技巧有哪些

Visual Studio原生開發(fā)的調試技巧有哪些

  1. 遠程和本地機器上的防火墻必須允許Visual Studio和遠程調試監(jiān)控之間能夠通信

  2. 想要調試,PDB文件是關鍵;為了能夠讓VisualStudio自動加載它們,必須滿足以下條件:

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

 2) 遠程機器上的托管PDB文化必須可用。

遠程調試監(jiān)控下載:

  •  Visual Studio 2008 Service Pack 1 Remote Debugger

  • Microsoft Visual Studio 2010 Remote Debugger

“Visual Studio原生開發(fā)的調試技巧有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

網(wǎng)頁題目:VisualStudio原生開發(fā)的調試技巧有哪些-創(chuàng)新互聯(lián)
路徑分享:http://muchs.cn/article22/dejgjc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、網(wǎng)站排名小程序開發(fā)、營銷型網(wǎng)站建設、網(wǎng)站建設、品牌網(wǎng)站設計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營