首先说明:如果没有进入调试模式的话,默认的调试窗口如下:

开始前的准备:

新建控制台程序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 Kwhile (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 diewhile (waitFor5) { ;}int i;//spin up all procsfor (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会中断。

这个时候再看看调试窗口会发现多了几个窗口:

点击调试->窗口->并行任务,界面如下:

按下F5,继续运行:

双击查看相应等待的任务,就可以知道这个工作线程为什么等待了。

例如:

继续按F5,运行,你应该会看到:

总之关于当前运行的并行任务你都可以看的到。

关闭程序,重新F5,进入调试模式

选择调试->窗口->并行堆栈

可以看到:

其中蓝线代表当前正在执行的线程。

如果右键点击方法视图的S.C ,可以看到右键菜单如下:

点击切换方法视图

可以看到:

关闭程序,重新F5,进入调试模式

点击调试->窗口->线程:

可以看到:

当前控制台的所有线程都在这里。

在线程上点击右键可以冻结线程:

冻结线程也就是Pause线程,

冻结的线程可以被解冻,也就是Resume。

其他的窗口:

调试->窗口->模块:可以看到当前程序加载的所有模块。

调试->窗口->进程:

调试->窗口->反汇编:

调试->窗口->寄存器:

调试->窗口->调用堆栈:

调用堆栈窗口是比较常用的窗口:

上图表示先调用A方法,接着B方法,接着C方法。

也可以认为是C方法是B调用,而B方法是A调用的。

其他窗口比较常用,就不介绍了,是不是有一些你没用到的窗口呢?

引用:http://www.cnblogs.com/LoveJenny/archive/2011/12/08/2280157.html

转载于:https://www.cnblogs.com/xust/articles/2883018.html

一些可能没用过的调试窗口相关推荐

  1. vs2010 调试窗口debugger UTF8 显示汉字 乱码

    谨记:vs默认debug调试显示变量是 GB2312编码,而开发中c.cpp文档编码格式通常需要UTF-8,在此文档下汉字字符串已经是UTF8,调试窗口是用GB2312显示乱码(本身并未乱码)所以需要 ...

  2. codeblocks调试窗口字体大小以及修改主题

    环境: ubuntu 18.10 code:blocks 16.01 #---------------------------------------------------------------- ...

  3. vs中寄存器调试窗口可看出程序是多少位运行的及cpu寄存器使用情况

    如果不清楚程序是多少位运行的,可在vs中的调试->寄存器调试窗口查看寄存器的寻址位数,如果是32位的exe则寄存器寻址显示32位,64位的exe则显示64位寻址 1.根据IntPtr.Size来 ...

  4. 自定义调试窗口---上面板

    Customize and Control devTools 一.调试窗口和当前网页有3种布局形式(Dock side) 1.调试窗口在当前网页上弹出,彼此独立:2调试窗口在当前网页下面,彼此相连:3 ...

  5. VS2010调试窗口一闪而过解决方法

    VS2010调试窗口一闪而过解决方法 参考文章: (1)VS2010调试窗口一闪而过解决方法 (2)https://www.cnblogs.com/jack-jia-moonew/p/4157924. ...

  6. 关于点击事件网页自动跳转,并且F12的调试窗口消失,找不到调用方法的解决办法

    在浏览器问题定位进行F12调试的时候,遇到了点击按钮之后,方法执行并且立刻跳转,然后调试窗口自动关闭,被调用的方法自然也就找不到了.查了下大部分都说进行勾选Preserve Log. 但是我这中情况由 ...

  7. VC的监视窗口等调试窗口的使用

    一.监视窗口 1.配置应用程序,使应用程序处于调试状态. 2.点击"调试"----"窗口"----"监视"----"监视1&quo ...

  8. T67 silvaco deckbuild 调试窗口消失

    silvaco deckbuild 调试窗口消失 状态窗口消失 debug窗口消失 鼠标放在下方,缓慢向上移动,知道出现,上下箭头加等号的符号,再向上拖动.

  9. vs 运行c++调试窗口不显示运行结果【脱坑】

    vs 运行c++调试窗口不显示运行结果[脱坑] 运行代码,进行调试, 如果看见黑屏不显示结果 肯定是窗口字体设置成黑色了 右键上边白色窗口,点击属性更改字体颜色就行了

最新文章

  1. nRF5_SDK_12.3.0 编译micro-ecc摘要
  2. Building your training into your researcing
  3. RocketMQ源码解析:Filtersrv
  4. Android之内存溢出(Out Of Memory)的总结
  5. paip.重装系统后firefox火狐收藏夹的恢复
  6. paip.c++ qt __gxx_personality_sj0 __gxx_personality_v0问题的解决
  7. Grasshopper 0.9汉化版下载 【Rhino5.0参数化插件】
  8. 多种方法对网页文字进行快速复制(仅供学习使用,勿践踏他人成果)
  9. ChinaVis 2017
  10. 根据域名快速查询IP
  11. CSIG基础研究岗腾讯面试经验
  12. 致远OA漏洞学习——A6版本敏感信息泄漏漏洞
  13. Win10系统CLSID大全介绍
  14. python手持弹幕LED滚动字幕
  15. 微信最强花式操作,带你玩转 wxpy
  16. 数分可视化笔记整理4 - 2017年内地电影和票房数据情况(条形图)
  17. 想创业,就别输不起!--leo看赢在中国第三季(7)
  18. java小鸡大冒险_小鸡大冒险怎么玩 新手攻略
  19. error LNK2038: 检测到“RuntimeLibrary”的不匹配项 解决方法
  20. python使用requests处理form-data格式的传参

热门文章

  1. 2022-2028年中国机制砂石行业投资分析及前景预测报告
  2. RPC 笔记(05)— socket 通信(单线程服务器)
  3. 2022-2028年中国聚乳酸降解塑料行业市场运营格局及投资前景趋势报告
  4. PyTorch中文文档 说明书
  5. GOF23设计模式(创建型模式) 原型模式
  6. HiCar基本功能介绍
  7. ARM的突破:超级计算机和Mac
  8. 计算机组成原理-第二章 数据表示与运算
  9. 2021年大数据Spark(四十一):SparkStreaming实战案例六 自定义输出 foreachRDD
  10. CentOS安装crontab