- 论坛徽章:
- 0
|
Author:wmmwang(unc,王敏敏)
Enviroment:fedora8.0
CrossCompile:arm-linux-gcc3.4.1
Minigui:1.3.3
Date:2008.12.10
摘要:
三天前,给自己的多线程程序为保护共享引入了信号量机制,一天之后程序出现问题。
现象:
程序没有崩溃,还在运行,像是等待信号量导致生产者线程阻塞。
排查:
1.在怀疑阻塞的线程里sem_wait()前后printf,果然只有sem_wait()前的结果出来,之后的就不出来了;
2.初始给信号量2个资源,发现还是如此问题,不够?那再给,给你10个资源!晕,问题照旧;
3.尝试使用sem_trywait(),结果发现还是sem_trywait()之前的printf有出来,之后的还是不出来,奇了怪了,sem_trywait()不会阻塞线程的,咋后面的那个printf还不出来??莫非信号量那个地方被恶意修改了?
4.把生产者线程生产的个数显示出来,每次sem_wait()准备就将次数++,结果发现,生产的次数并不是我希望的次数,实际的次数多了!!!
那就问题来了,生产的东西放在数组里的,这不就是数组越界了嘛!!!而信号量的定义就在数组下面,那岂不是maybe把我的信号量恶意改写?SHIT!
5.检查程序,发现一个地方笔误,改完,OK!
总结:
这次调试首先感谢杨普杰同学帮忙,给了一个晚上的全力帮助。
分析问题的时候,思路要清晰,不要慌,不要瞎调,不然花了时间也调不出来,清晰的思路很重要。
还有,发现问题的时候想用调试工具去找内存泄露所在地方的,结果这个工具没发现我程序内存泄露,可能工具做的还不是很完善!所以,最终,还是要靠自己!
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/46715/showart_1712687.html |
|