目录
客户问题
客户报告程序hang在那不干活了,通过查看现场发回来的diag信息,我们发现有一个进程几乎占用了100%CPU。
于是让客户发回来这个进程的core dump。
研究发现它陷入了一个循环链表。
GDB自定义命令发现循环链表
这个问题我们按照客户的重现办法在release版本上能重现,但在debug版本上无法重现。所以我就想写一个GDB自定义命令打印这个链表,同时如果是循环链表则给出警告。当然你可以改源代码,但那样周期就长了,因为你要编译+部署+重现。
我先直接给出GDB自定义命令的实现,然后再详细解释:
注意:这个代码只检查了job header是环的一部分,没检查内部有环的情况。
define print_job_list
set $jobhead_real=*(void**)&jobhead
set $jobtemp1=$jobhead_real
set $jobcount1=0

当客户报告一个程序挂起且消耗大量CPU时,通过core dump分析发现进程陷入循环链表。在无法在debug版本复现问题的情况下,使用GDB自定义命令`print_job_list`来检查并警告循环链表的存在,该命令遍历链表,如果发现job header是环的一部分,则提示循环并终止。文章还提供了命令的详细解释和使用指南。
订阅专栏 解锁全文
545





