Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8128179
  • 博文数量: 159
  • 博客积分: 10424
  • 博客等级: 少将
  • 技术积分: 14615
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-14 12:45
个人简介

啦啦啦~~~

文章分类
文章存档

2015年(5)

2014年(1)

2013年(5)

2012年(10)

2011年(116)

2010年(22)

分类: LINUX

2011-03-17 22:12:04

作者:gfree.wind@gmail.com
博客:linuxfocus.blog.chinaunix.net

在软件开发的过程中,无论如何努力,bug几乎都是必不可少的。当某些bug发生时,该进程会产生coredump文件。通过这个coredump文件,开发人员可以找到bug的原因。但是coredump的产生,大都是因为程序crash了。

而有些bug是不会导致进程crash的,比如死锁——这时,程序已经不正常了,可是却没有coredump产生。如果环境又不允许gdb调试,难道我们就束手无策了吗?针对这种情况,一般情况下,对于这样的进程,可以利用watchdog监控它们,当发现这些进程很长时间没有更新其heartbeat时,可以给这些进程发送可以导致其产生coredump的信号。根据linux的信号默认的处理行为,SIGQUIT,SIGABRT, SIGFPE和SIGSEGV都可以让该进程产生coredump文件。这样我们可以通过coredump来得知死锁是否发生。当然,如果进程添加了这些信号的处理函数,那么就不会产生coredump了。不过,对于SIGABRT, SIGFPE, SIGSEGV,有谁会为它们加上信号处理函数呢。

还有一种情况,进程并没有死锁或者block在某个位置,但是我们需要在某个指定位置进行调试,获取某些变量或者其它信息。但是,有可能是客户环境或者生产环境,不允许我们进行长时间的检测。那么,我们就需要通过coredump来获得进程在运行到该点时的快照。
这个时候,可以利用gdb来产生手工产生coredump。在attach上这个进程时,在指定位置打上断点,当断点触发时,使用gdb的命令gcore,可以立即产生一个coredump。这样,我们就拿到了这个位置的进程快照。


阅读(19406) | 评论(8) | 转发(17) |
给主人留下些什么吧!~~

GFree_Wind2011-06-26 16:51:55

如果用heartbeat的话,那么就需要一个monitor进程,来检查heartbeat。不生成coredump,可以使用通过函数栈来查看是否进程一直在等锁,也可以使用strace来查看系统API的调用。

uc1002002011-06-26 08:55:38

恩,分析的很好,学习到了,请问 怎么知道"进程很长时间没有更新其heartbeat"?如果是线程,应该也适应吧?还有,若果系统不能生成coredump,还有其他神马办法检测程序运行过程中出现了死锁吗?谢谢!

GFree_Wind2011-05-26 13:35:44

lijianweiabcde: 呵呵,知道了。linux下面有11个信号的默认操作是产生coredump文件的.....
呵呵,自己找到了啊

GFree_Wind2011-05-26 13:35:24

lijianweiabcde: linux对所有信号的默认处理都能产生core文件吗?.....
不是。
使用 man 7 signal,你可以看到所有的默认处理方式

GFree_Wind2011-05-26 13:34:04

lijianweiabcde: 记得以前面试的时候,考官问我 如何检测死锁,我说可以利用coredump然后他就没有再问,不知道回答的对不对.还有其他可以检查死锁的方法吗?.....
1,code review,看锁的调用顺序;
2,在锁中加检测,可以判断是否重复上锁;
3,在锁中加上超时,如长时间得不到,很可能死锁;
其实挺多方法的。