10個VisualStudio原生開發的除錯技巧

2021-06-19 21:07:24 字數 4246 閱讀 1323

英文原文:

10 morevisual studio debugging tips for native development

我最近遇到了一篇

ivan shcherbakov

寫的名為

10+個關於

visual studio

的強大除錯技巧的文章。然而這篇文章只是提供了一些相對基本的關於

visual studio

的除錯技巧。這裡至少還有一些同樣有用的其他技巧。因此,我整理了一些工作在最新的

visual studio 2008

上的原生開發的

10個除錯技巧。(如果你工作在託管**下,這偵錯程式有更多的特性,在

codeproject

技巧1:異常中斷 在

1個處理被呼叫之前,異常發生了,它可以命令偵錯程式中斷。那使得你能夠在異常發生之後立即去除錯你的應用程式。操作這呼叫棧可以讓你去發現這異常的根本原因。

visual studio

允許你指定你想中斷的特殊異常的型別。

1個對話方塊提供從選單

debug>exceptions

中。你能夠指定原生的(或者託管的)異常和除偵錯程式已知的預設異常。你還能夠新增你自定義的異常。

下面是乙個當

std::exceptin

被丟擲時偵錯程式中斷的例子。

技巧2:watch視窗中的偽變數

watch

視窗或者

quickwatch

對話方塊都提供了一些指定的(偵錯程式能夠識別的)被稱作偽變數的變數。這些被製作成文件的包含:

無論如何,關於最近錯誤的偽變數是非常有用的。

技巧3:在符號超過範圍之後檢視堆物件

有時,你喜歡檢視

1個物件(在堆上)甚至是在符號超過範圍的物件的值。當這發生了,這在

watch

視窗中的變數是灰掉的並且是不能被檢查(也不能更新),儘管這個物件依然是生存和正常的。如果你知道這個物件的位址,在全效能下繼續觀察它是可能的。你能夠轉換這個位址成這個物件型別的指標然後將它放入

wathc

視窗中。

在下面的例子中,在執行出

do_foo()

之後,_foo

是不再能夠被訪問的。然而,用它的位址並且轉換它成

foo*

,這樣我們依然能夠觀察這個物件。

技巧4:檢視1

個陣列內的一串行值

如果你工作在

1個展開在

watch

中的大陣列(至少幾百個元素,但是可能更少)然後去查詢一些特定範圍的元素將是難以處理的。因為你必須大量滾動。但是如果這個陣列是分配在堆上,你甚至都不能在

watch

視窗中展開它的元素。這裡有

1個關於那個問題的解決方案。你能夠用語法

(array+ ),去檢視特定範圍開始於

位置(你的真實物件的源陣列)。如果你想檢視全部的陣列,你能夠簡單的使用

rray,

如果你的陣列是在堆上,那麼你能夠在

watch

視窗裡將它展開,但是要檢視

1個特定範圍,你必須用乙個稍微不同的語法

:((t*)array+ ),(注意這個語法對在堆上的多維陣列也有效)。在這種情況下,

t是這種陣列的元素的型別。

如果你工作在

mfc下並用來自於其中的

"array"

容器,像

carray,cdwordarray,cstringarray,

等等。你當然能夠應用這相同的篩選,除此之外你必須檢視

array

的成員變數

m_pdata,

它是擁有資料的真實快取。

技巧 5: 

避免進入不需要的函式

當你在除錯**的時候,你可能經常進入到那些你想跳過的函式,無論它是建構函式

,賦值操作或是其他的。它們中的

1個經常困擾著我,最甚者就是

cstring

建構函式。這裡有

1個例子,當準備進入

take_a_string()

函式時,首先進入了

cstring

的建構函式。

void take_a_string(cstring const &text)

void test_string()

幸運的是,告訴偵錯程式去越過一些函式、類或者整個命名空間。過去曾用的方法已經改變了。回到

vs 6

的日子,它通常是通過

autoexp.dat

檔案來指定的。由於

visual studio2002

改變為通過暫存器設定。為了跳過函式,你必須新增一些值在暫存器中 

(你能夠找到更多詳情在 

here):

為了避免進入任何 

cstring

函式,我新增了下面的值:

使得它可用,儘管當你強迫進入在上面例子中的

take_a_string()

,這偵錯程式將跳過

cstring

建構函式。

:

技巧 6: 從**啟動偵錯程式

你可能很少需要附加偵錯程式到程式中去,但你不能執行它在

attach

視窗(可能因為中斷發生太快而沒有**獲),你也不能開始程式在偵錯程式最初的地方。你能夠在程式中產生乙個中斷並給偵錯程式乙個機會通過呼叫內在的

__debugbreak()

去附加。

void break_for_debugging()

這裡有乙個事實上的其他方法去完成這。例如觸發中斷

3,但是這僅僅工作在

x86平台上

(asm

不再在c++

支援x64

)。這裡另外還有1個

debugbreak()

函式,但這是不是簡便的,所以推薦的方法是內部的。

__asm int 3;

當你的程式產生乙個內部的停止,你有機會附加乙個偵錯程式進這個程序。

: 技巧 

7: 在

output

視窗列印

通過呼叫

debugoutputstring

在偵錯程式的output視窗中顯示特定的文字是可行的。如果沒有偵錯程式附加,這函式不起作用。

tip 8: 

記憶體洩露隔離

在原生開發中記憶體洩漏是非常重大的問題,找到它們是乙個嚴重的挑戰特別是在大型專案中。

visual studio 

提供關於檢測到的記憶體洩漏的報告。這裡也有其他的應用程式(免費的或商業的)去幫助你關於它。儘管在一些情況下,它是可能的當分配最終洩漏用偵錯程式去中斷。 然而為了達到這一點,你必須找到

1個可復現的位置號(盡量那可能是不容易的)。如果你能夠做到這一點,接下來當它執行時偵錯程式將會中斷。

讓我們設想

1份分配

8個位元組的**,但是絕不釋放這分配的記憶體。

visual studio

會顯示這個洩漏物件的報告。多執行幾次,我們會發現它一直是相同的位置數

(341)。

void

leak_some_memory()

dumping objects ->

d:\marius\vc++\debuggingdemos\debuggingdemos.cpp(

103) : normal block at 0x00f71f38, 

8bytes 

long.

data: cd cd cd cd cd cd cdcd 

object

dump complete. 在

1個特定(可復現)位置中斷的步驟是:

譯者注:

技巧 9: 

除錯發行版

除錯和發行版本意味著不同的目的。除錯配置用來做開發,顧名思義發行配置是用來作為程式的最終版本的。據估計是由於它滿足發行必須的質量要求,如此

1個配置包含優化及去掉了在除錯版本中的除錯資訊。然而,有時你可以想像除錯除錯版一樣去除錯發行版。為了做到這一點,你必須在配置中做一些改變。但是在這種情況下,它證明你不再是在除錯發行版,而是相當於乙個除錯和發行的混合版。

這兒有一些你必須做的事,這必須的是:

: how to: debug a release build

技巧 10: 

遠端除錯

另乙個重要的除錯經驗是遠端除錯,這是乙個巨大的話題,多次被提到,所以我僅僅簡而概之。

: :

微軟明年發布Visual Studio 「10」

剛看到的,不知道又有什麼新東西出現,一年一次,搞開發的人都快瘋了吧?呵呵 微軟今天放出了乙份visual studio 2008概要介紹演示文稿,不過在最後我們發現了乙個有趣的地方,那就是微軟打算在2009年推出全新版本,暫時稱為visual studio 10 visual studio 2008...

11個強大的Visual Studio除錯小技巧

除錯是軟體開發周期中很重要的一部分。它具有挑戰性,同時也很讓人疑惑和煩惱。總的來說,對於稍大一點的程式,除錯是不可避免的。最近幾年,除錯工具的發展讓很多除錯任務變的越來越簡單和省時。這篇文章總結了可能節省你大量時間的十個visual studio的除錯技巧和方法。除錯是很有挑戰性的。比如在函式內逐步...

11個強大的Visual Studio除錯小技巧

除錯是軟體開發周期中很重要的一部分。它具有挑戰性,同時也很讓人疑惑和煩惱。總的來說,對於稍大一點的程式,除錯是不可避免的。最近幾年,除錯工具的發展讓很多除錯任務變的越來越簡單和省時。這篇文章總結了可能節省你大量時間的十個visual studio的除錯技巧和方法。除錯是很有挑戰性的。比如在函式內逐步...