如何检测死锁并快速定位死锁位置
2016-08-04 11:44
260 查看
在游戏中有时会遇到这样一种情况,某客户端发了个请求到服务端,但收不到服务端回复,看服务端的log,也没任何错误,最后调试跟踪代码,发现代码死锁了。遇到这种情况比较纠结,于是捣腾了一个自动检测死锁的功能,如果发生死锁,会马上打印堆栈信息,并终止程序,如果是在调试环境中,会自动断点到发生死锁的地方。
实现思路如下:
比如Task A已经拥有了Lock 1,并准备去获取Lock 2,此时检测一下Lock 2是否被其它Task拥有了,如果没有,那Task A就很Happy的直接获取Lock 2就行了。如果Lock 2已经被Task B拥有了,那就检测一下Task B是否在等待Lock 1,如果是的话就说明是死锁了,此时打印一下堆栈信息,如果在调试环境,就中断调试,以方便查看死锁现场,否则直接退出程序。
这样虽然上锁的效率会降低,但很快就能发现死锁。一般发布游戏到线上的时候,就把死锁检测功能去掉,也不会影响性能。
看下我的测试代码:
运行结果:
很方便,有木有。
实现思路如下:
比如Task A已经拥有了Lock 1,并准备去获取Lock 2,此时检测一下Lock 2是否被其它Task拥有了,如果没有,那Task A就很Happy的直接获取Lock 2就行了。如果Lock 2已经被Task B拥有了,那就检测一下Task B是否在等待Lock 1,如果是的话就说明是死锁了,此时打印一下堆栈信息,如果在调试环境,就中断调试,以方便查看死锁现场,否则直接退出程序。
这样虽然上锁的效率会降低,但很快就能发现死锁。一般发布游戏到线上的时候,就把死锁检测功能去掉,也不会影响性能。
看下我的测试代码:
TaskMutex mutex1; TaskMutex mutex2; void m1() { try { mutex1.lock(); sleep(1); mutex2.lock(); mutex2.unlock(); mutex1.unlock(); } catch (...) { std::cout << boost::current_exception_diagnostic_information() << std::endl; } } void m2() { try { mutex2.lock(); sleep(1); mutex1.lock(); mutex2.unlock(); mutex1.unlock(); } catch (...) { std::cout << boost::current_exception_diagnostic_information() << std::endl; } } int main(int argc, char *argv[]) { try { IoScheduler scheduler(2); scheduler.schedule(boost::bind(&m1)); scheduler.schedule(boost::bind(&m2)); scheduler.stop(); } catch (...) { std::cout << boost::current_exception_diagnostic_information() << std::endl; } std::cout << "will exit.." << std::endl; return 0; }
运行结果:
$./god_task_mutex_dead_lock 2013-Aug-01 09:22:46.306073 FATAL god:task_mutex god/task_mutex.cpp:56 lock Deadlock found between 0x8148ca0 and 0x8148ce0 2013-Aug-01 09:22:46.306710 FATAL : god/task_mutex.cpp:57 lock NOTREACHED backtrace: ./god_task_mutex_dead_lock() [0x80bfa78] ./god_task_mutex_dead_lock() [0x8054d3b] ./god_task_mutex_dead_lock() [0x80c733c] ./god_task_mutex_dead_lock() [0x80cc7c3] ./god_task_mutex_dead_lock() [0x80d839d] terminate called without an active exception
很方便,有木有。
相关文章推荐
- 如何检测死锁并快速定位死锁位置
- 如何检测死锁并快速定位死锁位置
- 如何在vs2008,vs2010的解决方案管理器中快速定位文件位置
- dSYM-如何快速定位到已发布程序的crash位置(一)
- 项目网站页面制作中如何快速定位导致页面莫名问题位置!
- 如何快速定位Android内存泄漏位置
- Wince内存泄露检测工具Application Verifier的使用和如何快速定位泄露语句
- php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
- 如何快速定位native方法在对应so中的位置
- Wince内存泄露检测工具Application Verifier的使用和如何快速定位泄露语句(二)
- 如何能够快速检测定位出局域网中的ARP病毒电脑
- dSYM-如何获取dSYM UUID并快速定位到已发布程序的crash位置(二)
- AD9中运行DRC后,如何从DRC中快速定位到PCB中的具体错误位置?
- 如何快速定位TempDB产生问题
- html快速定位到表单没有填写的位置
- 如何准确定位 有透明区域纹理图的位置
- 51CTO技术沙龙第四期:如何快速定位黑客攻击
- linux下编译make文件报错“/bin/bash^M: 坏的解释器,使用grep快速定位代码位置
- 快速定位软件的安装位置
- 系列:iOS开发-如何快速定位bug并解决