亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#中一些你可能沒用過的調試窗口的方法

2020-01-24 03:21:24
字體:
來源:轉載
供稿:網友

首先說明:如果沒有進入調試模式的話,默認的調試窗口如下:

image

開始前的準備:

新建控制臺程序DebugWindowDemo:

修改Program.cs 的代碼為:

復制代碼 代碼如下:

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;

class S
    {
       public static void Main()
        {
            pcount = Environment.ProcessorCount;
            Console.WriteLine("Proc count = " + pcount);
            ThreadPool.SetMinThreads(4, -1);
            ThreadPool.SetMaxThreads(4, -1);

            t1 = new Task(A, 1);
            t2 = new Task(A, 2);
            t3 = new Task(A, 3);
            t4 = new Task(A, 4);
            Console.WriteLine("Starting t1 " + t1.Id.ToString());
            t1.Start();
            Console.WriteLine("Starting t2 " + t2.Id.ToString());
            t2.Start();
            Console.WriteLine("Starting t3 " + t3.Id.ToString());
            t3.Start();
            Console.WriteLine("Starting t4 " + t4.Id.ToString());
            t4.Start();

            Console.ReadLine();
        }

        static void A(object o)
        {
            B(o);
        }
        static void B(object o)
        {
            C(o);
        }
        static void C(object o)
        {
            int temp = (int)o;

            Interlocked.Increment(ref aa);
            while (aa < 4)
            {

            }

            if (temp == 1)
            {
                // BP1 - all tasks in C

                Debugger.Break();
                waitFor1 = false;
            }
            else
            {
                while (waitFor1)
                {

                }
            }
            switch (temp)
            {
                case 1:
                    D(o);
                    break;
                case 2:
                    F(o);
                    break;
                case 3:
                case 4:
                    I(o);
                    break;
                default:
                    Debug.Assert(false, "fool");
                    break;
            }
        }
        static void D(object o)
        {
            E(o);
        }
        static void E(object o)
        {
            // break here at the same time as H and K

            while (bb < 2)
            {

            }
            //BP2 - 1 in E, 2 in H, 3 in J, 4 in K

            Debugger.Break();
            Interlocked.Increment(ref bb);

            //after

            L(o);
        }
        static void F(object o)
        {
            G(o);
        }
        static void G(object o)
        {
            H(o);
        }
        static void H(object o)
        {
            // break here at the same time as E and K

            Interlocked.Increment(ref bb);
            Monitor.Enter(mylock);
            while (bb < 3)
            {

            }
            Monitor.Exit(mylock);


            //after

            L(o);
        }
        static void I(object o)
        {
            J(o);
        }
        static void J(object o)
        {
            int temp2 = (int)o;

            switch (temp2)
            {
                case 3:
                    t4.Wait();
                    break;
                case 4:
                    K(o);
                    break;
                default:
                    Debug.Assert(false, "fool2");
                    break;
            }
        }
        static void K(object o)
        {
            // break here at the same time as E and H

            Interlocked.Increment(ref bb);
            Monitor.Enter(mylock);
            while (bb < 3)
            {

            }
            Monitor.Exit(mylock);


            //after

            L(o);
        }
        static void L(object oo)
        {
            int temp3 = (int)oo;

            switch (temp3)
            {
                case 1:
                    M(oo);
                    break;
                case 2:
                    N(oo);
                    break;
                case 4:
                    O(oo);
                    break;
                default:
                    Debug.Assert(false, "fool3");
                    break;
            }
        }
        static void M(object o)
        {
            // breaks here at the same time as N and Q

            Interlocked.Increment(ref cc);
            while (cc < 3)
            {

            }
            //BP3 - 1 in M, 2 in N, 3 still in J, 4 in O, 5 in Q

            Debugger.Break();
            Interlocked.Increment(ref cc);
            while (true)
                Thread.Sleep(500); // for ever

        }
        static void N(object o)
        {
            // breaks here at the same time as M and Q

            Interlocked.Increment(ref cc);
            while (cc < 4)
            {

            }
            R(o);
        }
        static void O(object o)
        {
            Task t5 = Task.Factory.StartNew(P, TaskCreationOptions.AttachedToParent);
            t5.Wait();
            R(o);
        }
        static void P()
        {
            Console.WriteLine("t5 runs " + Task.CurrentId.ToString());
            Q();
        }
        static void Q()
        {
            // breaks here at the same time as N and M

            Interlocked.Increment(ref cc);
            while (cc < 4)
            {

            }
            // task 5 dies here freeing task 4 (its parent)

            Console.WriteLine("t5 dies " + Task.CurrentId.ToString());
            waitFor5 = false;
        }
        static void R(object o)
        {
            if ((int)o == 2)
            {
                //wait for task5 to die

                while (waitFor5) { ;}


                int i;
                //spin up all procs

                for (i = 0; i < pcount - 4; i++)
                {
                    Task t = Task.Factory.StartNew(() => { while (true);});
                    Console.WriteLine("Started task " + t.Id.ToString());
                }

                Task.Factory.StartNew(T, i + 1 + 5, TaskCreationOptions.AttachedToParent); //scheduled

                Task.Factory.StartNew(T, i + 2 + 5, TaskCreationOptions.AttachedToParent); //scheduled

                Task.Factory.StartNew(T, i + 3 + 5, TaskCreationOptions.AttachedToParent); //scheduled

                Task.Factory.StartNew(T, i + 4 + 5, TaskCreationOptions.AttachedToParent); //scheduled

                Task.Factory.StartNew(T, (i + 5 + 5).ToString(), TaskCreationOptions.AttachedToParent); //scheduled


                //BP4 - 1 in M, 2 in R, 3 in J, 4 in R, 5 died

                Debugger.Break();
            }
            else
            {
                Debug.Assert((int)o == 4);
                t3.Wait();
            }
        }
        static void T(object o)
        {
            Console.WriteLine("Scheduled run " + Task.CurrentId.ToString());
        }
        static Task t1, t2, t3, t4;
        static int aa = 0;
        static int bb = 0;
        static int cc = 0;
        static bool waitFor1 = true;
        static bool waitFor5 = true;
        static int pcount;
        static S mylock = new S();
    }


F5,開始運行:

由于Debugger.Break();

所以當執行到這里的時候,Debugger會中斷。

這個時候再看看調試窗口會發現多了幾個窗口:

image

點擊調試->窗口->并行任務,界面如下:

image

按下F5,繼續運行:

image 

雙擊查看相應等待的任務,就可以知道這個工作線程為什么等待了。

例如:

image

繼續按F5,運行,你應該會看到:

image

總之關于當前運行的并行任務你都可以看的到。

關閉程序,重新F5,進入調試模式

選擇調試->窗口->并行堆棧

可以看到:

image

其中藍線代表當前正在執行的線程。

如果右鍵點擊方法視圖的S.C ,可以看到右鍵菜單如下:image

點擊切換方法視圖

image

可以看到:

image

關閉程序,重新F5,進入調試模式

點擊調試->窗口->線程:

可以看到:

image

當前控制臺的所有線程都在這里。

在線程上點擊右鍵可以凍結線程:

image

凍結線程也就是Pause線程,

凍結的線程可以被解凍,也就是Resume。

其他的窗口:

調試->窗口->模塊:可以看到當前程序加載的所有模塊。

image

調試->窗口->進程:

image

調試->窗口->反匯編:

image

調試->窗口->寄存器:

image

調試->窗口->調用堆棧:

調用堆棧窗口是比較常用的窗口:

image

上圖表示先調用A方法,接著B方法,接著C方法。

也可以認為是C方法是B調用,而B方法是A調用的。

其他窗口比較常用,就不介紹了,是不是有一些你沒用到的窗口呢?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人中文字幕| 欧美一性一乱一交一视频| 欧美精品制服第一页| 韩国三级日本三级少妇99| 色伦专区97中文字幕| 久久影视电视剧免费网站| 美日韩精品视频免费看| 8050国产精品久久久久久| 精品中文字幕久久久久久| 中文字幕亚洲欧美日韩在线不卡| 欧美一区二区影院| 日本精品久久电影| 日韩电影中文 亚洲精品乱码| 国产一区二区av| 亚洲欧美激情四射在线日| 国产精品第七影院| 亚洲欧美制服第一页| 午夜精品美女自拍福到在线| 亚洲一区av在线播放| 日韩福利视频在线观看| 久久天天躁狠狠躁夜夜av| 国产精品高潮呻吟久久av无限| 欧美中在线观看| 亚洲欧美成人精品| 国产精品欧美亚洲777777| 国产精品亚洲欧美导航| 欧美日韩精品中文字幕| 久久久久久久亚洲精品| 日韩欧美在线观看| 欧美夫妻性生活视频| 久久视频在线视频| 欧美日韩中文字幕在线视频| 欧美激情手机在线视频| 亚洲天堂av在线免费| 日韩国产激情在线| 国产一区二区日韩精品欧美精品| 91精品国产精品| 日韩色av导航| 国产精品吴梦梦| 91精品国产成人www| 久久偷看各类女兵18女厕嘘嘘| 国产日本欧美一区| 成人网中文字幕| 亚洲热线99精品视频| 亚洲欧美综合另类中字| 色诱女教师一区二区三区| 亚洲免费电影一区| 国产999精品久久久影片官网| 日韩av免费在线观看| 九九精品在线播放| 欧美国产激情18| 亚洲网站在线看| 欧美成人精品h版在线观看| 欧美日韩综合视频| 在线电影av不卡网址| 亚洲色图校园春色| 欧美亚洲另类制服自拍| 亚洲成人动漫在线播放| 亚洲va国产va天堂va久久| 亚洲欧美日韩国产中文| 在线视频一区二区| 亚洲精品999| 欧美激情第三页| 国产有码在线一区二区视频| 欧美黄色www| 欧美寡妇偷汉性猛交| 亚洲欧洲第一视频| 久久天天躁狠狠躁夜夜av| 午夜精品美女自拍福到在线| 亚洲国模精品私拍| 欧美老女人在线视频| 欧美在线www| 一区二区三区四区视频| 亚洲国产中文字幕久久网| 亚洲人成网站在线播| 中文字幕日韩欧美在线视频| 一本一本久久a久久精品牛牛影视| 国产一区私人高清影院| 欧美在线一级va免费观看| 国产日韩在线一区| 亚洲国产天堂久久综合| 亚洲欧美一区二区三区情侣bbw| 狠狠躁夜夜躁久久躁别揉| 中文欧美日本在线资源| 欧美激情第三页| 国产中文字幕亚洲| 亚洲欧美精品中文字幕在线| 国产91精品久久久久久久| 日本人成精品视频在线| 久久久久北条麻妃免费看| 欧美激情免费观看| 成人在线观看视频网站| 奇米影视亚洲狠狠色| 亚洲品质视频自拍网| 亚洲精品第一页| 欧美激情一级精品国产| 日韩av中文在线| 成人精品网站在线观看| 国产精品嫩草影院一区二区| 亚洲精品有码在线| 国产日韩欧美一二三区| 日韩精品视频在线观看网址| 成人欧美一区二区三区黑人孕妇| 91亚洲精品一区二区| 欧美国产精品人人做人人爱| 久久这里只有精品视频首页| 欧美—级a级欧美特级ar全黄| 伊人男人综合视频网| 日韩av免费在线看| 久久视频精品在线| 亚洲一区二区三区成人在线视频精品| 亚洲精品美女网站| 国内伊人久久久久久网站视频| 亚洲全黄一级网站| 国产精品狠色婷| 欧美日韩午夜激情| 欧美日韩在线观看视频小说| 亚洲美女福利视频网站| 欧美性猛交xxxx乱大交蜜桃| 国产日韩在线亚洲字幕中文| 成人妇女免费播放久久久| 亚洲欧美在线播放| 欧美性在线观看| 欧美国产中文字幕| 欧美国产日韩一区二区| 成人www视频在线观看| 国产精品成人aaaaa网站| 日本一区二区在线免费播放| 欧美夫妻性生活xx| 日韩精品视频在线播放| 国产97色在线|日韩| 亚洲欧美日韩久久久久久| 亚州国产精品久久久| 国产精品美女无圣光视频| 国产精品精品视频一区二区三区| 国产不卡视频在线| 国产一区二区三区网站| 欧美专区中文字幕| 欧美性猛交视频| www高清在线视频日韩欧美| 韩日欧美一区二区| 国产日韩专区在线| 国产精品成人品| 国产主播精品在线| 欧美成人h版在线观看| 久久精品国产亚洲精品2020| 欧美性猛交xxxx乱大交3| 国产成人精品久久久| 综合国产在线视频| 国产精品三级网站| 国产精品久久久久久亚洲影视| 久久韩国免费视频| 国产精品v日韩精品| 欧美激情亚洲自拍| 国产精品扒开腿爽爽爽视频| 日韩视频免费在线| 欧美华人在线视频| 国产精品久久不能| 91亚洲一区精品| 欧美国产欧美亚洲国产日韩mv天天看完整| 在线精品视频视频中文字幕| 久久久久久成人精品| 国产欧美亚洲视频| 91欧美视频网站|