最近朋友项目发生了一件怪事,好好的进程,没有任何痕迹地退出,没有core文件,没有syslog痕迹,也不是进程主动退出,因为逻辑中exit都有日志。

现在记录一下追查过程:

1.先排除core生成条件不足的可能性

1)查看ulimit -c,

2)查看/proc/sys/kernel/core_pattern,

3)查看/etc/sysctl.conf中的

kernel.core_pattern = /var/core/core_%e_%p_%t
kernel.core_uses_pid = 0

这些设置都正常

2.排除程序自身exit

排查代码发现所有exit的地方都有日志,而现在进程退出没有任何exit相关的日志

3.查看syslog

在进程退出时间先后查看syslog没有发现任何异常

4.排除主动调用kill

查看机器的history,并没有发现有人调用过kill

从上面的结果看,应该是进程主动退出,但是并非是程序中的exit,那么大概率只有一种可能是进程收到了某种信号,然后导致进程退出。其实kill本身也是信号。那么怎么追踪呢?祭出大杀器:gdb,进程退出,最后应该会进入exit接口处理收尾工作。那就gdb在exit函数这里打断点,同时因为不可能直接在终端开着gdb,如果终端断开的话就会终止gdb监控,而本身这个异常退出就是不定时的,所以必须是后台模式启动gdb。

最关键的操作如下:

1.生成一个gdb脚本文件:monitor

b exit
c
bt
q

2.nohup gdb -p server --command=monitor &

这样后台起一个任务,监控server程序退出时的exit的调用,在程序退出的时候会生成一个result文件nohup.out

两天后sevrer有挂掉了,查看gdb结果文件看到:

Thread 2 "GameRunner" received signal SIGPIPE, Broken pipe.
[Switching to Thread 0x7efc25351700 (LWP 2086776)]
__libc_write (nbytes=223, buf=0x7efc200012a0, fd=14)at ../sysdeps/unix/sysv/linux/write.c:26
26      ../sysdeps/unix/sysv/linux/write.c: No such file or directory.
#0  __libc_write (nbytes=223, buf=0x7efc200012a0, fd=14)at ../sysdeps/unix/sysv/linux/write.c:26
#1  __libc_write (fd=14, buf=0x7efc200012a0, nbytes=223)at ../sysdeps/unix/sysv/linux/write.c:24
#2  0x00007efc26aa55c5 in ?? () from /lib/x86_64-linux-gnu/libcrypto.so.1.1
#3  0x00007efc26aa072a in ?? () from /lib/x86_64-linux-gnu/libcrypto.so.1.1
#4  0x00007efc26a9f784 in ?? () from /lib/x86_64-linux-gnu/libcrypto.so.1.1
#5  0x00007efc26a9fc43 in BIO_write ()from /lib/x86_64-linux-gnu/libcrypto.so.1.1
#6  0x00007efc26a9df01 in ?? () from /lib/x86_64-linux-gnu/libcrypto.so.1.1
#7  0x00007efc26aa0116 in BIO_ctrl ()from /lib/x86_64-linux-gnu/libcrypto.so.1.1
#8  0x00007efc26d22f3d in ?? () from /lib/x86_64-linux-gnu/libssl.so.1.1
#9  0x00007efc26d31e8f in ?? () from /lib/x86_64-linux-gnu/libssl.so.1.1
#10 0x00007efc26d224a3 in ?? () from /lib/x86_64-linux-gnu/libssl.so.1.1
#11 0x0000562740764db0 in init_sslwebsocket_server_connection (con=0x7efc200066a0) at yknet_sslwebsocket_pipe.cpp:76
#12 0x0000562740763d03 in yknet_ssl_pipe_handshake (pe=pe@entry=0x7efc20021540)at yknet_pipe_base.cpp:1167
#13 0x0000562740763e2b in yknet_ssl_pipe_conn_sock_readcb (fd=14,event=<optimized out>, arg=0x7efc20021540) at yknet_pipe_base.cpp:1209
#14 0x0000562740775fd4 in event_process_active_single_queue (base=base@entry=0x56274325c200, activeq=0x56274325c650,max_to_process=max_to_process@entry=2147483647, endtime=endtime@entry=0x0)at event.c:1691
#15 0x0000562740776bcf in event_process_active (base=0x56274325c200)at event.c:1783
#16 event_base_loop (base=0x56274325c200, flags=flags@entry=1) at event.c:2006
#17 0x0000562740763b7e in yknet_pipe_base_process_send_data (base=b

原来是  Thread 2 "GameRunner" received signal SIGPIPE, Broken pipe,进程收到了信号SIGPIPE,该信号默认结束进程,而server代码中并没有忽略这个信号。问题最后找到了答案,就是对常见的应该屏蔽的信号没有处理,导致进程结束。最后从之前的老的代码库中抄了一段:

// ignore signalssignal(SIGINT, SIG_IGN);signal(SIGHUP, SIG_IGN);signal(SIGQUIT, SIG_IGN);signal(SIGPIPE, SIG_IGN);signal(SIGTTOU, SIG_IGN);signal(SIGTTIN, SIG_IGN);signal(SIGTERM, SIG_IGN);

问题解决!

没有core的程序异常退出追查过程相关推荐

  1. 如何让程序异常退出后重启

    标 题:如何让程序异常退出后重启 发信人:蔡子楠 出处:http://www.freeeim.com/ 时 间:2008-02-14 11:25:22 "程序 FreeEIM.exe 遇到问 ...

  2. 如何定位导致程序异常退出的Bug?

    一 引言 我们写代码的时候经常会遇到一些Bug导致程序异常退出,比如访问了空指针.在大多数情况下,我们能够根据经验和IDE本身提供的调试功能来定位问题,并找到解决方案.但最近在工作中遇到了一个问题,一 ...

  3. 安卓软件错误log_Android编程实现捕获程序异常退出时的错误log信息功能详解

    本文实例讲述了Android编程实现捕获程序异常退出时的错误log信息功能.分享给大家供大家参考,具体如下: 很多时候我们程序无缘无故的就挂掉了,让我们一头雾水,如果刚好我们在调试,那我们可以通过错误 ...

  4. main()如果返回0,则代表程序正常退出,返回非零代表程序异常退出。

    main()如果返回0,则代表程序正常退出,返回非零代表程序异常退出. 参考文章: (1)main()如果返回0,则代表程序正常退出,返回非零代表程序异常退出. (2)https://www.cnbl ...

  5. C#WinForm程序异常退出的捕获、继续执行与自动重启

    C#WinForm程序异常退出的捕获.继续执行与自动重启 参考文章: (1)C#WinForm程序异常退出的捕获.继续执行与自动重启 (2)https://www.cnblogs.com/mq0036 ...

  6. 让程序异常退出后自动重启

    "程序 FreeEIM.exe 遇到问题异常退出,是否重启?",类似的情况我们似乎碰见过,很多程序都有这个功能:这是怎么实现的呢?经  过一番努力,在MSDN找到了SetUnhan ...

  7. linux进程异常退出分析,ECS Linux程序异常退出提示“out of memory”的临时解决办法...

    ECS Linux上的程序会出现异常退出的情况,退出的原因多数是因为系统内存不足,Linux内存不足通常会触发 Linux 内核里的 Out of Memory (OOM) killer,OOM ki ...

  8. linux c 程序异常退出时打印堆栈调用信息

    先来了解三个函数 #include <execinfo.h> int backtrace(void **buffer, int size); char **backtrace_symbol ...

  9. 通过gdb core dump方法查看程序异常时的堆栈信息

    在Linux下可通过core文件来获取当程序异常退出(如异常信号SIGSEGV, SIGABRT等)时的堆栈信息.core dump叫做核心转储,当程序运行过程中发生异常的那一刻的一个内存快照,操作系 ...

最新文章

  1. 计算机系统基础:设备管理知识笔记
  2. Typescript tsconfig
  3. java 日期只计算年月日大小_java 日期加减天数、月数、年数的计算方式
  4. 安装Editplus软件
  5. 上海图书馆e卡通阅读器差强人意
  6. 面试丨求职时这样回答问题你就输了!来自IT面试官视角的深度解读
  7. 隐马尔可夫模型(HMM)
  8. 【Proteus仿真】BME280温湿度气压传感器数据串口输出
  9. [架构之路-32]:目标系统 - 系统软件 - Linux OS用户空间程序的启动、关闭、监管 -- init进程
  10. Neutron IPAM源码分析
  11. Elasticsearch7.12常用操作总结
  12. python 采用数值方法计算最速曲线
  13. 电源平面Z阻抗参数的提取是否需要设置VRM,以及Port 参考阻抗对仿真结果的影响
  14. 这世上没有末路,你从不曾孤独
  15. 业余时间零基础自学编程,9 个月后我成为一名软件工程师
  16. 【路径规划】基于灰狼算法实现机器人栅格地图路径规划matlab源码
  17. 安卓手机和苹果手机如何设置HTTP代理IP上网
  18. 顺丰职级分成4级_阿里职位层级(附P级详细要求)
  19. Win10 新版Edge浏览器Flash Player不兼容,总是显示flash与地区不兼容(完美解决)
  20. C语言程序设计笔记(浙大翁恺版) 第五周:循环控制

热门文章

  1. c++中define用法
  2. 【解决】Moving Logs/AssetImportWorker 1.log to Logs/AssetImportWorker 1-prev.log: 另一个程序正在使用此文件,进程无法访问。
  3. System.UnauthorizedAccessException: 对路径“.......”的访问被拒绝的解决办法
  4. 39.五言、七言律句
  5. linux合并odex工具,安卓8.0合并ODEX工具
  6. .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  7. 字节跳动青训营--前端day3
  8. Excel2010学习贴2:新Excel的颜色机制
  9. java exif 怎么获取属性_Java如何读取图片EXIF信息
  10. 简单客户端服务器网络通信程序