vs逐语句调试过程中按键变灰_C#多线程编程之使用Visual Studio 2012进行调试

1相关概念

1)栈帧

C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。

栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。

2)单步执行与单步函数执行

单步执行又被称为逐语句执行,单步函数执行又被称为逐过程执行。单步函数执行不会进入函数体。

3)主线程不会显示在Parallel Tasks 窗口中,因为主线程不是任务。但它会显示在显示线程的窗口中。

2Parallel Tasks 窗口

打开窗口

断点调试情况下,按F5或点击“启动调试”

2656253c463aa6d6c44aa8809d7f3922.png

在上步基础上,点击“调试”——>“窗口”

09ed01e7b395e3bbd6ff637a2c542e2b.png

在上步基础上,点击“任务”

9a09a7b06397f0df19845c95691b9372.png

在上步基础上,右键单击任务窗口,调出菜单,可以调出为每一个任务分配的线程

55b709c07e33ac8d6edd9f53a4ea4f76.png
083ae89fcf001471055f9a3814921dc3.png

说明:

1)下图显示没有任务可显示,这是因为,将断点打到图示位置,还没有执行任务。

235e4d72fbc4a86fbfebc5fccada59f9.png

2)在Parallel Tasks 窗口中,双击一个任务,可显示所选任务将要运行的下一条语句。

3)任务还没有分配时,Parallel Tasks 窗口中没有任何信息显示,下图状态中按F10逐过程执行,会出现一条信息,如下图所示:

7cc0c5ce082d89491aa354a125d0a596.png

接着,继续按F10,会出现第二条信息,如下图所示:

631ada6b83edf6d54324080a186b0c32.png

上面两幅图中Parallel Tasks 窗口左侧的黄色箭头指示当前任务。

4)只关注一个任务

为了能够在有多个任务并行执行的时候,专注观察一个任务的执行情况,可使用“冻结线程”功能。

如下图所示,Parallel Tasks 窗口中有5个任务,其中1个已分配,4个在执行。

3e45480a7978191b2973f5f74038b758.png

在上图中,右键,调出菜单,选择“冻结此线程之外的所有线程”,结果依次如下面两幅图

87f468b5d7f9f4478b7933a92ccc5f4f.png
bb6e93d63d264a56650bc625d08e3296.png

上图中蓝色的暂停标识表示被冻结的任务。

值得注意的是:我们的程序中有五个任务,然而这里显示四个任务在运行,还有一个已分配,那么它是没有被冻结的,所以还不能够实现专注调试一个任务的目的,待到这个任务运行时,将其冻结后,才可专注调试一个任务。

b823852ff2af1607f8fd2196eca6693a.png

下图是只有一个活动的任务。

8b5229a27bd6fbc7c8ebd3aa339771d9.png

再者:F10为逐过程运行,F11为逐句运行,调试时请使用F11,逐句调试更易发现问题。

5)切换到任务

在Parallel Tasks 窗口,右键点击调出菜单,选择“切换到任务”,可以定位到那个任务对应的匿名方法

2c47057fca66bf7f41ac20dfed0e1bd2.png

3 Threads窗口

断点调试状态下,按F5或点击“启动调试”,然后点击“调试”——>“窗口”——>“线程”:

cfb6a4c4c9592e2151c503c8d954fbc2.png

说明:

1)双击Threads窗口中相应的行可以看到将要执行下一行语句或线程的当前行,如下图所示:

eb6c78b13df20ddd13715f6b7b37ede4.png
265e366f6654ca7c36785db5c963e8e9.png

2)Threads窗口不一定会将所有任务都显示出来。

如下图,所示将断点打在第13行,只能看到主线程被加载,其他的任务都没有显示出来。

dff2f7b1a5ff8d3a8a377e4952f112d2.png

多加几个断点,如下图所示:

bd58729f77b0f22d8682b7ea9d11528b.png

按F5,如下图所示:

c46c11bd964ef2abbf1bfc3fb2d7ac26.png

双击上图中某一条,注意窗口信息的变化。

cca7bd04c969dca13988b87878e5a4c4.png
2014e4e7622c837e435a87999e15f3d4.png

4 Call Stack窗口

断点调试状态下,按F5或点击“启动调试”,然后点击“调试”——>“窗口”——>“调用堆栈”

e9834fd6483d63d14edcd6b40aa3b2d0.png

在上图Call Stack窗口中,右键单击,调出菜单。

e8beb7f00301b60c7b7baabc8784fede.png

5 Parallel Stack窗口

断点调试状态下,按F5或点击“启动调试”,然后点击“调试”——>“窗口”——>“并行堆栈”

6a73c1f6a9cdddf1d132df37c5accb61.png

Parallel Stack窗口的左上角

37a52216f00ce46fa6e642ea272f72c3.png

可以切换显示线程和任务,切换到任务,显示如下:

7c7a44be521b4701bb6143f7a7aba507.png

说明:

1)节点之间的箭头表示任务或线程整体的调用路径,蓝色高亮箭头表示当前任务或线程的路径。

2)同时调出Parallel Stack和Parallel Task窗口,Parallel Stack设置如下图:

afeffb218d2f2c9e65801361e981f4fd.png

双击Parallel Task中的一条任务,可匹配到Parallel Stack中的任务。

4e95d9bea2f43e60de4c61d7fc1fd466.png

将Parallel Stack切换到线程视图,蓝色的为对应部分。

cf970fc51919bd23846d1da761fcd056.png

点击红框中的图表,可得下面的视图

38812137c0339c9fe615205303820c1e.png

6实战-运用

检测死锁

具体程序代码见易错点分析那部分。

按F5,然后“调试”——>“全部中断”,可得下面的结果,从图中可以看出两个任务状态都为“死锁”,双击每一条,可定位到相应的任务。

04cfb3ebdb454da1a3c1716ee70a1d8b.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值