多线程的那点儿事(之多线程调试)
2015-11-02 09:40
621 查看
软件调试是我们软件开发过程中的重要一课。在前面,我们也讨论过程序调试,比如说这里。今天,我们还可以就软件调试多讲一些内容。比如说条件断点,数据断点,多线程断点等等。
[cpp]
view plaincopyprint?
#include <stdio.h>
int value = 0;
void test()
{
int total;
int index;
total = 0;
for(index = 0; index < 100; index ++)
total += index * index;
value = total;
return ;
}
int main()
{
test();
return 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)对于多线程来说,模块设计 > 编程预防 > 调试 > 事后补救。
[cpp]
view plaincopyprint?
#include <stdio.h>
int value = 0;
void test()
{
int total;
int index;
total = 0;
for(index = 0; index < 100; index ++)
total += index * index;
value = total;
return ;
}
int main()
{
test();
return 1;
}
#include <stdio.h> int value = 0; void test() { int total; int index; total = 0; for(index = 0; index < 100; index ++) total += index * index; value = total; return ; } int main() { test(); return 1; }(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)对于多线程来说,模块设计 > 编程预防 > 调试 > 事后补救。
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- c#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- C#中this的用法集锦
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析
- C#生成饼形图及添加文字说明实例代码
- C#判等对象是否相等的方法汇总
- RabbitMQ入门与使用篇 推荐
- linux网络编程----->高并发--->多线程并发服务器