暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Linux 使用strace命令查找进程卡死原因

岛哥手记 2021-09-03
2016

阅读本文大约需要1分钟。

点击👆小卡片,回复 “合集” 获取系统性的学习笔记和测试开发技能图谱


背景

最近遇到某个线上服务进程卡死的情况,但是在本地调试的过程中又没法复现,需要在线上服务器运行一段时间后在某些条件下才会触发。


定位问题

首先我们用ps auxf命令查看我们的进程执行到了哪一步:

可以看到执行到了[sh]然后就卡死了,然后我们接着通过strace命令来查看执行这个操作死在了哪个系统回调:

root@demo:~# strace -p 6093
Process 6093 attached
recvfrom(5,
复制

可以看到是死在了系统回调recvfrom这里,描述符5的具体含义我们可以进入 /proc/pid/fd 查看:

root@demo:~# cd /proc/6093/fd


root@demo:/proc/6093/fd# ls -l
total 0
lr-x------ 1 root root 64 Jul 14 05:58 0 -> pipe:[675847127]
l-wx------ 1 root root 64 Jul 14 05:58 1 -> pipe:[675847128]
l-wx------ 1 root root 64 Jul 14 05:58 2 -> pipe:[675847128]
lr-x------ 1 root root 64 Jul 14 05:58 3 -> /dev/urandom
lrwx------ 1 root root 64 Jul 14 05:58 4 -> socket:[675848446]
lrwx------ 1 root root 64 Jul 14 05:58 5 -> socket:[675847890]
复制

我们可以发现,5代表的是socket,说明进程是死在socket通讯上了,那么再去排查线上服务器中有哪些服务用到了socket,最后定位到是X服务中大量不合理的使用socket连接导致的,至此问题就定位到了。


推荐阅读:

Jenkins拉取代码提示 “Current Git branch is HEAD detached at”

iOS真机安装WebDriverAgent图文详解

苹果个人付费开发者证书申请及使用图文详解


文章转载自岛哥手记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论