Visual Studio 調試小技巧

來源:互聯網
上載者:User

作者:http://blog.csdn.net/cadcisdhht/article/details/5651488

在用Visual Studio偵錯工具時,我們經常需要根據數值添加斷點。比如需要當i == 2時中斷運行,我們可以添加如下的斷點:

有些時候,我們需要根據字串的內容來添加斷點。比如我們在調試如下代碼:

void CVSDebugTricksDlg::OnBnClickedButton1()

{

char* string;

for(int i = 0; i < 5; ++i) {

string = GetString(i);

TRACE(string);

}

}

char* CVSDebugTricksDlg::GetString(int number)

{

switch (number) {

case 0:

return "Zero";

case 1:

return "One";

case 2:

return "Two";

default:

return "Other";

}

}

我們希望當運行到Trace(string)時,如果字串string為”Two”時能中斷運行。如果我們和根據數值添加斷點一樣的方法,添加如下斷點:

當我們運行上述代碼時,會發現即使string的內容”Two”時,運行並沒有中斷。這是因為==運算子比較的是兩個字串的地址而不是內容,因此上述斷點並不能滿足我們的需求。

Visual Studio考慮到程式員經常會根據字串的內容添加斷點,因此在添加斷點這個功能上為字串做了特殊的支援。我們在根據字串內容添加斷點時,可以使用strcmp等函數來設定斷點。

於是在上述樣本中,我們可以用strcmp函數來添加如下斷點:

Visual Studio中的添加斷點功能中支援的字串函數有:strlen, wcslen, strnlen, wcsnlen, strcmp, wcscmp, _stricmp, _wcsicmp, strncmp, wcsncmp, _strnicmp, _wcsnicmp, strchr, wcschr, strstr, wcsstr.

 

在使用Visual Studio開發偵錯工具時,我們經常需要開啟查看視窗(Watch)來分析變數。有時在查看視窗顯示的內容不是很直觀。為了能從查看視窗的變數中得到更多的資訊,我們需要一些小的技巧。下面是幾個例子。

1. Windows訊息

在開發調試介面程式時,我們經常需要查看訊息的內容。當在查看視窗中,僅僅只顯示出訊息對應的整數值,我們並不能直觀地知道究竟是什麼訊息。比如:

為了能讓查看視窗顯示出訊息內容,我們只需要在變數名添加“, wm”的格式化尾碼,就能顯示訊息的名字:

2. 控制代碼傳回值

Windows有很多API返回一個HANDLE類型的值來表示操作是否成功。當操作失敗時,返回一個特定的值來表示操作失敗的原因。通常我們不可能記住所有的錯誤碼對應的失敗類型。比如在下面的例子中,我們就不一定能看出0x80070005表示的錯誤原因:

為了能方便我們從控制代碼的錯誤碼中直觀地發現出錯原因,Visual Studio在查看視窗中提供了一個“, hr”尾碼。在變數名後添加該尾碼,查看視窗就能顯示出具有可讀性的資訊。比如,我們在上述傳回值後添加“, hr”之後,就能得到:

從這個控制代碼值的名字看來,很有可能是存取權限出問題了。

3. 錯誤碼

Windows 中有很多API在操作失敗時,會設定一個錯誤碼,程式員可以調用函數GetLastError得到該錯誤碼。在調試時,如果代碼中沒有調用GetLastError,那麼我們就不能很方便地得到給錯誤碼。

由於這個錯誤碼是設定在一個叫$ERR的寄存器裡。我們可以在查看視窗中顯示出該寄存器的值從而得到錯誤碼。例如,我們運行如下代碼:

HANDLE hFile = CreateFile(_T("temp2.txt"), GENERIC_READ, 0, NULL,

OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

如果我們之前沒有建立temp2.txt這個檔案,那麼我們就能得到如下的錯誤碼:

我們可能不能從錯誤碼0x0002看出出錯的原因。有了前面控制代碼的經驗,我們可以在後面添加“, hr”尾碼,此時查看視窗顯示為:

現在我們就知道出錯的原因是系統不能找到檔案。

4. 數組

數組是我們使用最為頻繁的一種資料結構。但當數組是以一個指標和其長度來表示時,查看視窗並不能直觀地顯示出數組中每個元素的值,而只能顯示出該數組的起始地址以及它的第一個元素。下面就是一個例子:

為了顯示出數組中所有元素的內容,我們可以在數組名的後面添加一個“, #”(#表示數組的長度)。如果我們在上面的數組名添加該尾碼名就得到:

作者:http://blog.csdn.net/cadcisdhht/article/details/5651488

在用Visual Studio偵錯工具時,我們經常需要根據數值添加斷點。比如需要當i == 2時中斷運行,我們可以添加如下的斷點:

有些時候,我們需要根據字串的內容來添加斷點。比如我們在調試如下代碼:

void CVSDebugTricksDlg::OnBnClickedButton1()

{

char* string;

for(int i = 0; i < 5; ++i) {

string = GetString(i);

TRACE(string);

}

}

char* CVSDebugTricksDlg::GetString(int number)

{

switch (number) {

case 0:

return "Zero";

case 1:

return "One";

case 2:

return "Two";

default:

return "Other";

}

}

我們希望當運行到Trace(string)時,如果字串string為”Two”時能中斷運行。如果我們和根據數值添加斷點一樣的方法,添加如下斷點:

當我們運行上述代碼時,會發現即使string的內容”Two”時,運行並沒有中斷。這是因為==運算子比較的是兩個字串的地址而不是內容,因此上述斷點並不能滿足我們的需求。

Visual Studio考慮到程式員經常會根據字串的內容添加斷點,因此在添加斷點這個功能上為字串做了特殊的支援。我們在根據字串內容添加斷點時,可以使用strcmp等函數來設定斷點。

於是在上述樣本中,我們可以用strcmp函數來添加如下斷點:

Visual Studio中的添加斷點功能中支援的字串函數有:strlen, wcslen, strnlen, wcsnlen, strcmp, wcscmp, _stricmp, _wcsicmp, strncmp, wcsncmp, _strnicmp, _wcsnicmp, strchr, wcschr, strstr, wcsstr.

在使用Visual Studio開發偵錯工具時,我們經常需要開啟查看視窗(Watch)來分析變數。有時在查看視窗顯示的內容不是很直觀。為了能從查看視窗的變數中得到更多的資訊,我們需要一些小的技巧。下面是幾個例子。

1. Windows訊息

在開發調試介面程式時,我們經常需要查看訊息的內容。當在查看視窗中,僅僅只顯示出訊息對應的整數值,我們並不能直觀地知道究竟是什麼訊息。比如:

為了能讓查看視窗顯示出訊息內容,我們只需要在變數名添加“, wm”的格式化尾碼,就能顯示訊息的名字:

2. 控制代碼傳回值

Windows有很多API返回一個HANDLE類型的值來表示操作是否成功。當操作失敗時,返回一個特定的值來表示操作失敗的原因。通常我們不可能記住所有的錯誤碼對應的失敗類型。比如在下面的例子中,我們就不一定能看出0x80070005表示的錯誤原因:

為了能方便我們從控制代碼的錯誤碼中直觀地發現出錯原因,Visual Studio在查看視窗中提供了一個“, hr”尾碼。在變數名後添加該尾碼,查看視窗就能顯示出具有可讀性的資訊。比如,我們在上述傳回值後添加“, hr”之後,就能得到:

從這個控制代碼值的名字看來,很有可能是存取權限出問題了。

3. 錯誤碼

Windows 中有很多API在操作失敗時,會設定一個錯誤碼,程式員可以調用函數GetLastError得到該錯誤碼。在調試時,如果代碼中沒有調用GetLastError,那麼我們就不能很方便地得到給錯誤碼。

由於這個錯誤碼是設定在一個叫$ERR的寄存器裡。我們可以在查看視窗中顯示出該寄存器的值從而得到錯誤碼。例如,我們運行如下代碼:

HANDLE hFile = CreateFile(_T("temp2.txt"), GENERIC_READ, 0, NULL,

OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

如果我們之前沒有建立temp2.txt這個檔案,那麼我們就能得到如下的錯誤碼:

我們可能不能從錯誤碼0x0002看出出錯的原因。有了前面控制代碼的經驗,我們可以在後面添加“, hr”尾碼,此時查看視窗顯示為:

現在我們就知道出錯的原因是系統不能找到檔案。

4. 數組

數組是我們使用最為頻繁的一種資料結構。但當數組是以一個指標和其長度來表示時,查看視窗並不能直觀地顯示出數組中每個元素的值,而只能顯示出該數組的起始地址以及它的第一個元素。下面就是一個例子:

為了顯示出數組中所有元素的內容,我們可以在數組名的後面添加一個“, #”(#表示數組的長度)。如果我們在上面的數組名添加該尾碼名就得到:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.