c++ - 如何在不记录核心转储或错误的情况下调试意外进程终止

原文 标签 c++ ubuntu segmentation-fault out-of-memory terminate

我有一组用 C++ 编写的多线程可执行文件,它们从 Ubuntu 机器上的 crontab 运行,主要从 websocket 连接获取和处理数据。这些可执行文件中的每一个都在一个while循环中运行,这样如果一个可执行文件终止,它会立即再次运行。
每当我运行这些可执行文件时,它们往往会正常运行几个小时,但随后会意外终止(全部同时),此时前面提到的 while 循环会导致它们重复启动,运行几秒钟,然后终止出乎意料地,无限循环地重复这个循环。
没有生成核心文件(即使我设置了“ulimit -c unlimited”并使用“-g -ggdb”构建了可执行文件,所以它们确实会在段错误时生成核心文件)。此外,“dmesg”没有显示任何表明重复终止/重新启动可执行文件的任何内容,实际上/var/log 中的所有日志似乎都没有显示任何值得注意的内容,所以我假设它们没有因为 OOM 而被杀死我最初的猜测。磁盘空间也很大。
如何调试这样的问题?还有其他地方可以查找错误消息吗?
我忘了提到,也没有任何值得注意的东西被打印到 stdout/stderr。另外,另一个奇怪的事情是,如果我杀死包含与其中一个可执行文件相对应的 while 循环的脚本(不接触任何其他 while 循环),然后在终端上手动运行该脚本,则相应的可执行文件似乎运行良好,无需终止,即使其他可执行文件仍在不断重新启动和立即终止。
我相信我已经将其范围缩小到与标准输出相关的内容。当我将 websocket 输出记录到标准输出时,会发生持续的重新启动和终止。当我删除该日志记录时,可执行文件不再崩溃。
哦,所以当可执行文件将 websocket 输出打印到标准输出时,它会将这个输出通过管道传输到“taskset -c 0 gzip -c”,显然这些 gzip 出于某种原因终止了,我什至没有注意到。任何想法为什么会这样或如何调试?

最佳答案

也许您可以尝试获取主 while 循环的 stderr 输出,以查看难以打印到控制台但未记录的内容。
如果是shell脚本,追加>output.log 2>&1在 linux 命令的末尾。
如果没有,你可以关注 /proc/<pid>/fd/1在哪里 <pid>是linux进程id

关于c++ - 如何在不记录核心转储或错误的情况下调试意外进程终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71544513/

相关文章:

postgresql - 如何在 OS X Lion 上获取核心转储?

c - 试图修复错误 - 段错误 11

c++ - 为什么 QGLWidget 只渲染一个空白屏幕?

postgresql - Ubuntu 18.04 和 PostgreSQL 10.9 : What do I fill in Properties Form to Get Them to Connect?

c - 由 MATLAB MEX 函数中的 "optimised out"值引起的 GCC 段错误

c++ - MPI_Scatterv 中的 displs 参数是什么?

c++ - 在Mac 10.9 Mavericks上,clang配置与gcc链接配置不同吗?

c++ - 存储可变参数模板的模板参数数量

c++ - 通用类型演绎斯科特·迈耶斯

Ubuntu 20.04 打包器自动安装提示 GUI