.Net多线程编程—使用Visual Studio 2012进行调试

1 相关概念

1)栈帧

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

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

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

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

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

2 Parallel Tasks 窗口

打开窗口:

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

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

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

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

说明:

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

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

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

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

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

4)只关注一个任务

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

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

在上图中,右键,调出菜单,选择

,结果一次入下面两幅图:

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

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

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

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

5)切换到任务

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

3 Threads窗口

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

说明:

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

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

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

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

按F5,如下图所示:

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

 4 Call Stack窗口

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

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

5 Parallel Stack窗口

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

Parallel Stack窗口的左上角

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

说明:

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

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

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

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

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

6 实战运用

检测死锁

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

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

  -----------------------------------------------------------------------------------------

时间仓促,水平有限,如有不当之处,欢迎指正。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏维C果糖

详述 IntelliJ IDEA 中恢复代码的方法「进阶篇」

在博文“ 详述 IntelliJ IDEA 中恢复代码的方法 ”中,咱们已经了解了如何将代码恢复至某一版本,但是通过Local History恢复代码有的时候并...

1788
来自专栏编舟记

Java高编译低运行错误(ConcurrentHashMap.keySet)

本地使用maven编译和运行时一切都正常,但是通过ci的方式,编译、打包、发布到部署环境,运行时抛出了一条显而易见的JDK版本的错误。

603
来自专栏码匠的流水账

使用maven构建java9 service实例

本文主要研究下如何在maven里头构建java9 multi module及service实例

281
来自专栏酷玩时刻

PC 微信扫码登陆

网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。进一步了解OAuth2.0-----理解OAuth2.0 官方介绍资料

584
来自专栏子勰随笔

开发中一些常用的工具链接(MD5、Timestamp等)

15710
来自专栏Youngxj

[教程]黑客级别的批量处理文件

813
来自专栏张戈的专栏

服务器反爬虫攻略:Apache/Nginx/PHP禁止某些User Agent抓取网站

我们都知道网络上的爬虫非常多,有对网站收录有益的,比如百度蜘蛛(Baiduspider),也有不但不遵守 robots 规则对服务器造成压力,还不能为网站带来流...

4115
来自专栏前端儿

前端神器之Sublime Text2/3简单明了使用总结

第一:也是最重要的,它占内存很小(就如同notepad++那般迅速打开,所以那款其实也不错~)。一般IDE比如WebStorm(它也是一款神器来着),Aptan...

672
来自专栏从零开始学自动化测试

Selenium+python自动化83-chrome手机wap模式

一、前言 这里是群里(QQ群:226296743)风神出60大洋悬赏的问题,学会这篇就是赚了60大洋了! 我的环境: - chrome 62 - chrome...

3054
来自专栏编程坑太多

react-native组建wechat

1113

扫描关注云+社区