Go:一次 exit code 是 137 且 无 coredump 的排错经历
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 的排错经历相关推荐
- Process finished with exit code 143
跑一个深度学习模型 第一次运行出现Process finished with exit code 137 之后再运行均出现Process finished with exit code 143 137 ...
- 《南溪的目标检测学习笔记》——验证模式下出现“Process finished with exit code 137 (interrupted by signal 9: SIGKILL)“的问题
1 问题描述 在验证模式下运行代码的时候,出现这样的错误: Process finished with exit code 137 (interrupted by signal 9: SIGKILL) ...
- Process finished with exit code 137 (interrupted by signal 9: SIGKILL)错误
程序正确运行结束的提示是:Process finished with exit code 0.如果程序出现Process finished with code 137 (interrupted by ...
- php exit code 255,使用exit(-1)为什么得到255退出码?
今天有人在微博上问了一个问题, 使用: string exec ( string $command [, array &$output [, int &$return_var ]] ) ...
- python Process finished with exit code -1073741819 (0xC0000005) 解决
运行程序时,Process finished with exit code -1073741819 (0xC0000005) 报错 原因:没有 python33.dll 在 c:\WINDOWS\sy ...
- Process finished with exit code -1073741819 (0xC0000005)
Process finished with exit code -1073741819 (0xC0000005) pycharm报错:Process finished with exit code - ...
- 获取线程结束代码(Exit Code)
线程结束代码可以调用GetExitCodeThread()(并给予CreateThread所获得的线程handle作为参数)而得知: BOOL GetExitCodeThread(HANDLE hTh ...
- iOS引入第三发库引发的错误linker command failed with exit code 1
引入第三发库导致项目崩溃 常见出错日志: Apple Mach-O Linker Error Group linker command failed with exit code 1 (use -v ...
- 解决git did not exit cleanly (exit code 128)
最近在用git提交代码到部门服务器上的时候,总是有 提示 git did not exit cleanly (exit code 128).网上有2种解决方式: 1.替换路径 1.鼠标右键 -> ...
- 【异常】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 ...
最新文章
- Linux常用基本命令:三剑客命令之-awk输入输出分隔符
- 累计连续签到设计和实现
- 公有云:美酒or毒药?--【软件和信息服务】2014.12
- jieba 词典 词频_在Hanlp词典和jieba词典中手动添加未登录词
- [未来的购碟指南]送给那些以后想收藏真人电影DVD的菜鸟们
- c 命令导出数据到mysql_MySQL命令行导出数据库
- JAVA泛型--待续
- Java Map 怎样实现Key 的唯一性?
- LeetCode 106. 已知中序后序 求二叉树
- mvc移动创建oracle表,使用 ASP.NET MVC (C#)在15分钟内创建电影数据库应用程序 | Microsoft Docs...
- C++结构体实例和类实例的初始化 .
- 记录——《C Primer Plus (第五版)》第十章编程练习第八题
- 在Ubuntu中搭建嵌入式Linux开发环境
- Barrett reduction
- 黑盒测试设计专题:正交试验
- 第11集丨Promise.reject
- Linux iptables MASQUERADE的作用
- 想成为年薪30W+的运营,你必须具备这4个“运营思维”
- 如何使用Ajax更新echarts工作省份信息
- MATLAB - 拉普拉斯算子可视化