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

Net多线程编程的更多相关文章

  1. Web Worker javascript多线程编程(一)

    什么是Web Worker? web worker 是运行在后台的 JavaScript,不占用浏览器自身线程,独立于其他脚本,可以提高应用的总体性能,并且提升用户体验. 一般来说Javascript ...

  2. Web Worker javascript多线程编程(二)

    Web Worker javascript多线程编程(一)中提到有两种Web Worker:专用线程dedicated web worker,以及共享线程shared web worker.不过主要讲 ...

  3. windows多线程编程实现 简单(1)

    内容:实现win32下的最基本多线程编程 使用函数: #CreateThread# 创建线程 HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpT ...

  4. Rust语言的多线程编程

    我写这篇短文的时候,正值Rust1.0发布不久,严格来说这是一门兼具C语言的执行效率和Java的开发效率的强大语言,它的所有权机制竟然让你无法写出线程不安全的代码,它是一门可以用来写操作系统的系统级语 ...

  5. windows多线程编程星球(一)

    以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...

  6. Java多线程编程核心技术---学习分享

    继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...

  7. python多线程编程

    Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...

  8. 浅述WinForm多线程编程与Control.Invoke的应用

    VS2008.C#3.0在WinForm开发中,我们通常不希望当窗体上点了某个按钮执行某个业务的时候,窗体就被卡死了,直到该业务执行完毕后才缓过来.一个最直接的方法便是使用多线程.多线程编程的方式在W ...

  9. Java—多线程编程

    一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存 ...

  10. [转]Linux 的多线程编程的高效开发经验

    Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断.本文中我们 ...

随机推荐

  1. MVC模式编程演示样例-登录验证(静态)

    好,上篇博客分享了本人总结的JSP-Servlet-JavaBean三层架构编程模式的实现思想和基本流程,接下来给大家分享一个MVC编程模式的实现演示样例-登录验证的过程,这里我仍然用的是静态的验证u ...

  2. tensorflow 下的滑动平均模型 —— tf.train.ExponentialMovingAverage

    在采用随机梯度下降算法训练神经网络时,使用 tf.train.ExponentialMovingAverage 滑动平均操作的意义在于提高模型在测试数据上的健壮性(robustness). tenso ...

  3. C#无符号右移

    /// <summary>         /// 无符号右移,与JS中的>>>等价         /// </summary>         /// & ...

  4. 【a101】高精度实数加法

    Time Limit: 1 second Memory Limit: 2 MB 问题描述 给出两个高精度正实数(可以含有小数点或没有),最长200位,字符串读入 求它们的和,小数部分末尾的0要舍去. ...

  5. 解读Java中BigDecimal.ZERO.compareTo()的返回值含义

    Java compareTo() 用法 例如: public static void main(String[] args) {     BigDecimal bnum1, bnum2; bnum1 ...

  6. oracle 重置序列从指定数字开始的方法详解

    原文 oracle 重置序列从指定数字开始的方法详解 重置oracle序列从指定数字开始 declare n ); v_startnum ):;--从多少开始 v_step ):;--步进 tsql ...

  7. 《SAS编程与数据挖掘商业案例》学习笔记之十二

    本次重点在:sas数据集管理 主要包含:包含数据集纵向拼接.转置.排序.比較.复制.重命名.删除等 1.append语句 注:base数据集和data两个数据集必须结构一样.避免使用force的情况, ...

  8. 体验ArcGIS9.2的历史库功能

    转自原文 体验ArcGIS9.2的历史库功能 ESRI公司于2006年11月9日全球同步发布了历史上重要的软件版本ArcGIS9.2,在该版本中,主要新增了以下四大功能(ESRI田昌莲): 第一大新功 ...

  9. [Django] Auth django app with rest api

    First, start the env: . bin/activate Then cd to our module cd djangular Create a new app: python man ...

  10. .net下载优酷1080P视频

    事实上流程大致是:调用飞驴下载API+js解析+文件下载+调用flvBind合并这样一个流程而已_(:з」∠)_ 貌似是不用太多的说明..嗯.. 起先的需求是从优酷上下载一些视频 只是网络上的各种软件 ...