Go:一次 exit code 是 137 且 无 coredump 的排错经历


最近在调试一个 Go 写的网关,总是莫名其妙地出现重启。

我以为是我写代码有 BUG 引发 panic 导致进程退出,我想借助 coredump 定位问题。

但是,在我设置如下后:

1.$ ulimit -c unlimited
2.$ export GOTRACEBACK=crash

更多参考:https://blog.csdn.net/test1280/article/details/112570784

在进程异常退出时,我没能找到 panic 输出,也没找到 coredump,如下:

...(一些前台终端日志输出)
已杀死
$

初时,我以为是 ulimit -c 或是 GOTRACEBACK 有问题,但是单独执行:

package mainfunc main() {panic("test1280-panic info")
}
$ go run main.go
panic: test1280-panic infogoroutine 1 [running]:
panic(0x466460, 0x48a298)
...
signal: aborted (core dumped)
$ file core*
core.25321: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from '/tmp/go-build3230483068/b001/exe/main'

可以正常地、如期地在 panic 时生成 coredump 文件。

可见并非是 ulimit -c 或 GOTRACEBACK 设置问题引起。

那问题就是在代码本身?

紧接着我又查看了 exit code。

我们知道,进程在消亡时,总会有一个 exit code 存在,记录进程消亡原因。

通过 echo $? 可以查看上一个命令(进程)的 exit code。

我是将此网关启动在前台,等网关进程异常退出,然后执行 echo $?

$ ./gateway
...(一些前台终端日志输出)
已杀死
$ echo $?
137

关键线索:退出码 137!

Google:golang exit code 137 no coredump

我查到一个提问:Process finished with exit code 137 in PyCharm

里面有一个回复:

Exit code 137 means that your process was killed by (signal 9) SIGKILL.
In most of the cases, it is caused by excessive memory usage.

exit code = 137,且 “已杀死”,指的是进程被 SIGKILL 信号干掉了。

而大多数情况下是因为内存使用超标导致(OOM),操作系统使用 SIGKILL 杀死进程。

!!!醍醐灌顶。赶快测试:

一边 tail -f /var/log/messages ,一边启动网关复现问题,果不其然,稍等片刻:

Feb 16 16:00:32 test1280 kernel: Out of memory: Kill process 20820 (gateway) score 100 or sacrifice child
Feb 16 16:00:32 test1280 kernel: Killed process 20820 (gateway) total-vm:3675256kB, anon-rss:804648kB, file-rss:124kB, shmem-rss:0kB

当前系统内存占用:【free 133MB】

$  free -htotal        used        free      shared  buff/cache   available
Mem:           7.6G        6.1G        133M         13M        1.4G        762M
Swap:            0B          0B          0B

真相终于揭晓:

并非是 Go 写的网关代码存在BUG,而是:
网关占用本剩余不多的内存触发OOM(虽然网关占用内存很少),被操作系统SIGKILL杀死。

被 SIGKILL 杀死,当然是没有 coredump 的。

用 C 复现测试一下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define SIZE 1024*1024*1024int main()
{void *p = malloc(SIZE);memset(p, 0, SIZE);sleep(60);return 0;
}
$ gcc -o main main.c
$ ./main
已杀死
$

此时,/var/log/message 可以观察到:

Feb 16 17:26:58 test1280 kernel: Out of memory: Kill process 28012 (main) score 98 or sacrifice child
Feb 16 17:26:58 test1280 kernel: Killed process 28012 (main) total-vm:1052748kB, anon-rss:788564kB, file-rss:52kB, shmem-rss:0kB

如果降低内存申请:(SIZE 由 1G 改为 10B)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define SIZE 10int main()
{void *p = malloc(SIZE);memset(p, 0, SIZE);sleep(60);return 0;
}
$ gcc -o main main.c
$ ./main
$ 【sleep 60s 后正常结束】

总结:

如果你的代码在运行时异常退出且出现“已杀死”,查看 exit code 是 137 时:

不一定是你的代码有 BUG,可能是操作系统内存不足,你的进程被 OOM kill 掉啦。

赶快检查下 /var/log/message 吧!


https://stackoverflow.com/a/50910479
https://stackoverflow.com/questions/43268156/process-finished-with-exit-code-137-in-pycharm


后记

后面发现,确实是我写的网关有内存泄漏问题,占用大约2GB内存。

Go:一次 exit code 是 137 且 无 coredump 的排错经历相关推荐

  1. Process finished with exit code 143

    跑一个深度学习模型 第一次运行出现Process finished with exit code 137 之后再运行均出现Process finished with exit code 143 137 ...

  2. 《南溪的目标检测学习笔记》——验证模式下出现“Process finished with exit code 137 (interrupted by signal 9: SIGKILL)“的问题

    1 问题描述 在验证模式下运行代码的时候,出现这样的错误: Process finished with exit code 137 (interrupted by signal 9: SIGKILL) ...

  3. Process finished with exit code 137 (interrupted by signal 9: SIGKILL)错误

    程序正确运行结束的提示是:Process finished with exit code 0.如果程序出现Process finished with code 137 (interrupted by ...

  4. php exit code 255,使用exit(-1)为什么得到255退出码?

    今天有人在微博上问了一个问题, 使用: string exec ( string $command [, array &$output [, int &$return_var ]] ) ...

  5. python Process finished with exit code -1073741819 (0xC0000005) 解决

    运行程序时,Process finished with exit code -1073741819 (0xC0000005) 报错 原因:没有 python33.dll 在 c:\WINDOWS\sy ...

  6. Process finished with exit code -1073741819 (0xC0000005)

    Process finished with exit code -1073741819 (0xC0000005) pycharm报错:Process finished with exit code - ...

  7. 获取线程结束代码(Exit Code)

    线程结束代码可以调用GetExitCodeThread()(并给予CreateThread所获得的线程handle作为参数)而得知: BOOL GetExitCodeThread(HANDLE hTh ...

  8. iOS引入第三发库引发的错误linker command failed with exit code 1

    引入第三发库导致项目崩溃 常见出错日志: Apple Mach-O Linker Error Group linker command failed with exit code 1 (use -v ...

  9. 解决git did not exit cleanly (exit code 128)

    最近在用git提交代码到部门服务器上的时候,总是有 提示 git did not exit cleanly (exit code 128).网上有2种解决方式: 1.替换路径 1.鼠标右键 -> ...

  10. 【异常】Container exited with a non-zero exit code 1 Failing this attempt.Stack trace: ExitCodeException

    [异常]Container exited with a non-zero exit code 1 Failing this attempt.Stack trace: ExitCodeException ...

最新文章

  1. Linux常用基本命令:三剑客命令之-awk输入输出分隔符
  2. 累计连续签到设计和实现
  3. 公有云:美酒or毒药?--【软件和信息服务】2014.12
  4. jieba 词典 词频_在Hanlp词典和jieba词典中手动添加未登录词
  5. [未来的购碟指南]送给那些以后想收藏真人电影DVD的菜鸟们
  6. c 命令导出数据到mysql_MySQL命令行导出数据库
  7. JAVA泛型--待续
  8. Java Map 怎样实现Key 的唯一性?
  9. LeetCode 106. 已知中序后序 求二叉树
  10. mvc移动创建oracle表,使用 ASP.NET MVC (C#)在15分钟内创建电影数据库应用程序 | Microsoft Docs...
  11. C++结构体实例和类实例的初始化 .
  12. 记录——《C Primer Plus (第五版)》第十章编程练习第八题
  13. 在Ubuntu中搭建嵌入式Linux开发环境
  14. Barrett reduction
  15. 黑盒测试设计专题:正交试验
  16. 第11集丨Promise.reject
  17. Linux iptables MASQUERADE的作用
  18. 想成为年薪30W+的运营,你必须具备这4个“运营思维”
  19. 如何使用Ajax更新echarts工作省份信息
  20. MATLAB - 拉普拉斯算子可视化

热门文章

  1. Nginx反向代理https配置解决方案
  2. ANSA二次开发实战——车身弯扭刚度计算文件自动生成(1)
  3. 硬件基本概念-模拟电子电路
  4. 大数据时代网络安全问题分析
  5. 手游联运系统入门知识
  6. cmd里面import不是内部外部命令
  7. SDCC 2016数据库架构技术峰会(深圳站),PPT全回顾
  8. Unity3d开发“类三消”游戏
  9. H3CNE、H3CSE考试总结
  10. U盘文件夹为空恢复方法,恢复U盘的空白文件夹