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

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

    转载与引用请注明出处。

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

  • 相关阅读:
    ZeptoLab Code Rush 2015
    UVa 10048 Audiophobia【Floyd】
    POJ 1847 Tram【Floyd】
    UVa 247 Calling Circles【传递闭包】
    UVa 1395 Slim Span【最小生成树】
    HDU 4006 The kth great number【优先队列】
    UVa 674 Coin Change【记忆化搜索】
    UVa 10285 Longest Run on a Snowboard【记忆化搜索】
    【NOIP2016提高A组模拟9.28】求导
    【NOIP2012模拟10.9】电费结算
  • 原文地址:https://www.cnblogs.com/hdwgxz/p/6308579.html
Copyright © 2020-2023  润新知