zoukankan      html  css  js  c++  java
  • 多线程的那点儿事(之多线程调试)

    【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

        软件调试是我们软件开发过程中的重要一课。在前面,我们也讨论过程序调试,比如说这里。今天,我们还可以就软件调试多讲一些内容。比如说条件断点,数据断点,多线程断点等等。

    [cpp] view plain copy
     
    1. #include <stdio.h>  
    2. int value = 0;  
    3.   
    4. void test()  
    5. {  
    6.     int total;  
    7.     int index;  
    8.   
    9.     total = 0;  
    10.     for(index = 0; index < 100; index ++)  
    11.         total += index * index;  
    12.   
    13.     value = total;  
    14.     return ;  
    15. }  
    16.   
    17. int main()  
    18. {  
    19.     test();  
    20.     return 1;  
    21. }  

    (1)数据断点

        所谓数据断点,就是全局变量或者函数中的数计算的过程中,如果数据值本身发生了改变,就会触发断点。这里的数据有两种,一个是全局数据,一个函数内部的数据。


    以全局数据value为例:

        a)按F10,运行程序,获取value的地址;

        b)Alt+F9,选择【DATA】->【Advanced】;

        c)在【Expression】中输入DW(0x0043178),【ok】回车;

        d)F5继续运行程序,则程序会在value发生改变的时候停住。

    以局部数据total为例,

        a)按F10,运行程序,获取value的地址;

        b)Alt+F9,选择【DATA】->【Advanced】;

        c)在【Expression】中输入total,在【Function】输入test,【ok】回车;

        d)F5继续运行程序,则程序同样会在total发生改变的时候停住。

    (2)条件断点

        条件断点和数据断点差不多。只不过,数据断点在数据发生改变的时候就会断住,而条件断点只有在满足一定的条件下才会有断住。比如说,我们可以让test子程序在index==5的时候断住。

        a)按F10,运行程序,获取value的地址;

        b)Alt+F9,选择【DATA】->【Advanced】;

        c)在【Expression】中输入index==5,在【Function】输入test,【ok】回车;

        d)F5继续运行程序,则程序同样会在index==5的时候停住。

    (3)多线程调试

        在VC上面对多程序的调试比较简单。如果想要对程序进行调试的话,首先F10,开始运行程序。其次,我们需要等线程创建之后才能设置断点,不然我们看到的程序只有main函数一个thread。

        a)单击【Debug】,选择【threads】,那么我们就可以开始多线程调试了;

        b)如果需要对某一个thread挂起,单击对应的thread,选择【suspend】即可;

        c)如果需要对某一个thread重新调度,单击对应的thread,选择【resume】即可;

        d)如果需要查看特定thread的堆栈,那么选择那个thread,然后【Set Focus】,关闭threads对话框,在堆栈窗口中即可看到;    

        e)如果某个线程被挂住,那么此时所有的线程都挂住了,如果你step运行,所有的threads都会参与运行;

        f)如果需要对某一个thread进行调试,那么需要对其他的thread进行suspend处理  。

    总结:

        1)看内存、看堆栈、条件断点、数据断点需要综合使用,

        2)编程越早调试,越好,

        3)先编写好单线程程序,再编写好多线程程序,

        4)对于多线程来说,模块设计 > 编程预防 > 调试 > 事后补救。

  • 相关阅读:
    了解 DICOM 基本协议与其相关
    C# PropertyInfo 反射实体部分字段
    ref(引用参数) 和 out(输出参数) 区别
    Linq Where Expression<Func<T,bool>> 查询条件
    随笔规范
    C# 集合分析
    C# 几种常用的数据类型
    关于 C# 方法参数的理解
    打算开始写博客了
    有趣的算法、逻辑面试题
  • 原文地址:https://www.cnblogs.com/zsq1993/p/6005841.html
Copyright © 2011-2022 走看看