多线程的那点儿事(之多线程调试)

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

[cpp] view plaincopy

  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)对于多线程来说,模块设计 > 编程预防 > 调试 > 事后补救。
   

 

from:http://blog.csdn.net/feixiaoxing/article/details/7043631

时间: 2024-08-02 19:29:56

多线程的那点儿事(之多线程调试)的相关文章

多线程的那点儿事(基础篇)

多线程编程是现代软件技术中很重要的一个环节.要弄懂多线程,这就要牵涉到多进程?当然,要了解到多进程,就要涉及到操作系统.不过大家也不要紧张,听我慢慢道来.这其中的环节其实并不复杂. (1)单CPU下的多线程 在没有出现多核CPU之前,我们的计算资源是唯一的.如果系统中有多个任务要处理的话,那么就需要按照某种规则依次调度这些任务进行处理.什么规则呢?可以是一些简单的调度方法,比如说 1)按照优先级调度 2)按照FIFO调度 3)按照时间片调度等等 当然,除了CPU资源之外,系统中还有一些其他的资源

java基本教程之常用的实现多线程的两种方式 java多线程教程_java

关于线程池的内容,我们以后会详细介绍:现在,先对的Thread和Runnable进行了解.本章内容包括:Thread和Runnable的简介Thread和Runnable的异同点Thread和Runnable的多线程的示例 Thread和Runnable简介Runnable 是一个接口,该接口中只包含了一个run()方法.它的定义如下: 复制代码 代码如下: public interface Runnable {    public abstract void run();} Runnable的

多线程的那点儿事(之死锁)

相信有过多线程编程经验的朋友,都吃过死锁的苦.除非你不使用多线程,否则死锁的可能性会一直存在.为什么会出现死锁呢?我想原因主要有下面几个方面:    (1)个人使用锁的经验差异    (2)模块使用锁的差异    (3)版本之间的差异    (4)分支之间的差异    (5)修改代码和重构代码带来的差异     不管什么原因,死锁的危机都是存在的.那么,通常出现的死锁都有哪些呢?我们可以一个一个看过来,     (1)忘记释放锁 [cpp] view plaincopy void data_pr

Java多线程编程基础之线程和多线程

[写在前面] 随着计算机技术的发展,编程模型也越来越复杂多样化.但多线程编程模型 是目前计算机系统架构的最终模型.随着CPU主频的不断攀升,X86架构的硬件已 经成为瓶,在这种架构的CPU主频最高为4G.事实上目前3.6G主频的CPU已经接近了顶峰. 如果不能从根本上更新当前CPU的架构(在很长一段时间内还不太可能),那么 继续提高CPU性能的方法就是超线程CPU模式.那么,作业系统.应用程序要发挥 CPU的最大性能,就是要改变到以多线程编程模型为主的并行处理系统和并发式 应用程序. 所以,掌握

多线程 同步 信号量-用信号量实现多线程同步(用 c# 语言实现) ?

问题描述 用信号量实现多线程同步(用 c# 语言实现) ? 现实信号量关键是 p v 操作,由于p v 操作是不可中断的,怎么模拟使得 p v 操作不可中断的执行呢? 解决方案 http://www.cnblogs.com/heqichang/archive/2011/12/24/2300301.html 解决方案二: http://blog.csdn.net/adream307/article/details/7566342

多线程问题-新手求助关于Java多线程中启动线程问题

问题描述 新手求助关于Java多线程中启动线程问题 public class Example15_1 { /** * @param args */public static void main(String[] args) { // TODO Auto-generated method stub SpeakHello speakHello; SpeakNinhao speakNinhao; speakHello = new SpeakHello(); speakNinhao= new Speak

多线程 java 同步 锁-java中多线程访问同步问题

问题描述 java中多线程访问同步问题 public class SyschronizedSample{ private int value; public synchronized int get(){ return value;} public synchronized void set(int value) { this.value=value; } } 以上的代码中,要使得访问value时具有线程安全,所以在set和get方法中都加了synchronized同步语句,如果只在set方法前

c# 多线程-用c#写了个多线程小程序,占用内存不断的增大,虚心求教

问题描述 用c#写了个多线程小程序,占用内存不断的增大,虚心求教 cleanDataTimer.Elapsed += new ElapsedEventHandler(CleanData); cleanDataTimer.Interval = 0.000000000006; cleanDataTimer.Enabled = true; Thread addRCSMemoryData = new Thread(new ThreadStart(AddRCSMemoryDeviceData)); add

多线程程序设计学习(14)多线程锁机制

  1.对象锁钥匙只能有一把才能互斥,才能保证共享变量的唯一性(一个对象一个wait set室)     2.在同步静态方法上的锁,和 实例方法上的锁,默认不是同样的,如果同步需要制定两把锁一样(同步静态方法的锁为当前类的对象,该实例的锁).     3.关于同一个类的方法上的锁,来自于调用该方法的对象,如果调用该方法的对象是相同的,那么锁必然相同,否则就不相同.比如 new A().x() 和 new A().x(),对象不同,锁不同,如果A的单利的,就能互斥.     4.静态方法加锁,能和