日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VS2017断点调试

發(fā)布時間:2024/4/24 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VS2017断点调试 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
VS2017調(diào)試技巧

閱讀目錄

  • 一、查看或修改變量的值
  • 二、控制線程下一步要執(zhí)行的代碼位置

閱讀目錄

  • Visual Studio的調(diào)試技巧
  • 演示環(huán)境:
  • 演示用的代碼:
  • 基本概念:斷點
  • 在數(shù)據(jù)被改變/讀取的時候掛起(面向?qū)ο蟀鏀?shù)據(jù)斷點)
  • 多線程調(diào)試
回到目錄

Visual Studio的調(diào)試技巧

調(diào)試技巧是衡量程序員水平的一個重要指標.掌握好的調(diào)試技巧與工具的使用方法,也是非常重要的.
***

回到目錄

演示環(huán)境:

VS2017
C#
***

回到目錄

演示用的代碼:

public class Program {private static int data { get; set; } = 0; public static void Main(string[] argv) { data = 10; new Thread(new ThreadStart(T1)) { IsBackground = true }.Start(); new Thread(new ThreadStart(T2)) { IsBackground = true }.Start(); Console.ReadKey(true); } private static int DataA { get; set; } = 0; private static int DataB = 0; private static void T1() { while (true) { DataA += 1; Thread.Sleep(1000); } } private static void T2() { while (true) { DataB += 1; Thread.Sleep(1000); } } }//End Class
回到目錄

基本概念:斷點

這是最基本的操作了,想必大伙都會了...
我們可以點擊編輯器的這個地方:

給代碼添加一個斷點,這樣當(dāng)代碼執(zhí)行到這里的時候就會掛起進程,此時代碼會暫停執(zhí)行,并等待用戶操作.

如何繼續(xù)?

可按以下快捷鍵其中一個來實現(xiàn)繼續(xù):
F5(繼續(xù)執(zhí)行,直到再次遇到斷點,或者按Ctrl+Alt+Break鍵強行中斷)
F10(步過,繼續(xù)執(zhí)行,但是到下一行又會掛起,不管下一行有沒有斷點)
F11(步入,和步過同效,但如果當(dāng)前掛起位置是一個函數(shù)的話,下一步會進到函數(shù)里)
Shift+F11(步出,執(zhí)行到當(dāng)前函數(shù)返回)

掛起的生效范圍

這個掛起,是對整個進程生效的,也就是說所有線程都會暫停.
掛起狀態(tài):

在掛起的時候能做的事

返回頂部

查看或修改變量的值

如同圖中那樣,當(dāng)鼠標指針指向變量名的時候,可以查看或修改該變量的值,修改完要按回車確認.
該操作僅限當(dāng)前位置作用域內(nèi)的變量.

返回頂部

控制線程下一步要執(zhí)行的代碼位置

看圖中左邊的小箭頭,其實是能拖動的!可以把他往上或往下拖,從而改變線程下一步要執(zhí)行的代碼位置,但是有兩點要注意:
1:位置改變了,但是操作過的變量值不會改變,所以別指望能用來倒退已經(jīng)執(zhí)行過的操作.
2:改變是有范圍的,不能跳到別的函數(shù),就算是局部函數(shù),也不能跳到外面.

回到目錄

在數(shù)據(jù)被改變/讀取的時候掛起(面向?qū)ο蟀鏀?shù)據(jù)斷點)

有時候代碼執(zhí)行到某地方,某個變量就會被莫名其妙的改了.這時候我們需要找出來是哪里改了這個變量.
VS有提供一個叫做[數(shù)據(jù)斷點]的東西,但那個只支持native類的語言,C#是不行的.
但有個不是很完美的方法:
我們可以給目標變量加上get;set;訪問器,然后在上面加斷點,看開頭的代碼:

private static int data {get; set; } = 0;

效果如下:

這時候按住Ctrl鍵不放,接著連續(xù)按D T鍵,就能呼出調(diào)用堆棧窗口,看是哪里在嘗試修改這個變量,也可以按Shift+F11,執(zhí)行到返回,這樣就能直接跳到修改這個變量的代碼:

說這個方法不完美是因為它對沒有代碼的其它dll里的全局變量無法使用.

給斷點加條件

當(dāng)我們在循環(huán)里打斷點的時候,斷點會被循環(huán)觸發(fā),這樣調(diào)試起來就很麻煩了,我們可以給斷點加條件,讓斷點滿足條件才觸發(fā).
按住Ctrl鍵不放,接著連續(xù)按D B鍵,能看到所有斷點的列表.

在目標斷點按下鼠標右鍵,在菜單里選擇設(shè)置.可進入斷點設(shè)置界面:

給條件打上勾.可看到有三種條件模板,三個模板可相與(居然不能相或...)

條件表達式:

可以輸入一條表達式,以表達式的結(jié)果決定是否觸發(fā),表達式參數(shù)可以是當(dāng)前斷點作用域內(nèi)的變量或常量,判斷方式有兩種:
表達式結(jié)果返回true時觸發(fā)
表達式結(jié)果變化時觸發(fā)(只支持bool類型結(jié)果)
提醒:如果想要在返回false的情況下觸發(fā),可以把表達式改為: !(表達式)

命中次數(shù):

代碼執(zhí)行過斷點次數(shù)達到一定次數(shù)才觸發(fā),這個模版分為三種類型:
等于:執(zhí)行過第x次觸發(fā)斷點
大于等于:執(zhí)行過第x次以及之后都觸發(fā)
倍數(shù)于:代碼執(zhí)行過x的倍數(shù)次時觸發(fā)斷點

篩選器:

可根據(jù)線程ID,線程名,進程ID,進程名,機器名,等條件決定是否斷下線程.各條件之間可進行邏輯操作
******

回到目錄

多線程調(diào)試

按住Ctrl鍵不放,接著連續(xù)按D T鍵,能顯示[線程]窗口,可從中看到當(dāng)前調(diào)試進程的所有線程.

查看所有線程當(dāng)前位置

點菜單欄的這個地方,能顯示所有線程掛起時的位置:

效果如下:

凍結(jié)一個線程

這時候我們可以單獨凍結(jié)一個線程,讓這個線程被單獨掛起,其它線程繼續(xù)調(diào)試,選擇線程,然后點這里:

如你所見,解凍按鈕就在旁邊...
線程被凍結(jié)后,就會被單獨掛起,直到解凍才繼續(xù)執(zhí)行.

切換線程

如果當(dāng)前掛起的線程不是自己要調(diào)試的線程,可以在這里切換到別的線程:

分類:?[15]Dev Tools

總結(jié)

以上是生活随笔為你收集整理的VS2017断点调试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。